Запрос диапазона Elasticsearch с несколькими условиями

#spring-boot #elasticsearch #java-8

#весенняя загрузка #elasticsearch #java-8

Вопрос:

Я должен извлекать записи из эластичного поиска на основе даты его обновления и создания. У меня есть эти два поля updatedDate и CreatedDate, и условие должно быть:

  1. Для извлечения записей с обновленной датой в диапазоне за последние 3 года.
  2. Если значение updatedDate равно null, извлеките записи, создавшие дату в диапазоне за последние 3 года.

Я написал запрос на Java для извлечения записей на основе записи CreatedDate:

 .must(QueryBuilders.rangeQuery("createdDate").from(startDate,true).to(endDate,true));
 

StartDate и EndDate содержат диапазон дат.

Я новичок в эластичном поиске, не знаю, как реализовать указанное выше условие.

Комментарии:

1. Лучше поделиться сопоставлением индексов, образцами и ожидаемыми документами в формате JSON, чтобы мы могли предоставить рабочее решение

Ответ №1:

Поскольку вы не предоставили никаких индексных данных, поэтому добавьте рабочий пример с образцом индексных данных, сопоставлением, поисковым запросом и результатом поиска, который удовлетворяет всем условиям, необходимым для вашего варианта использования.

Сопоставление индексов:

 {
  "mappings": {
    "properties": {
      "createdDate": {
        "format": "yyyy-MM-dd'T'HH:mm:ss'Z'",
        "type": "date"
      },
      "updatedDate": {
        "format": "yyyy-MM-dd'T'HH:mm:ss'Z'",
        "type": "date"
      }
    }
  }
}
 

Индексировать данные:

 {
    "createdDate": "2020-08-15T00:00:00Z"  
}
{
    "createdDate": "2019-08-15T00:00:00Z"  
}
{
    "createdDate": "2010-08-15T00:00:00Z"  
}
{
    "updatedDate": "2021-08-15T00:00:00Z",
    "createdDate": "2002-08-15T00:00:00Z"
}
{
    "updatedDate": "2018-08-15T00:00:00Z",
    "createdDate": "2020-09-15T00:00:00Z"
}
{
    "updatedDate": "2000-08-15T00:00:00Z",
    "createdDate": "2020-09-15T00:00:00Z"
}
 

Поисковый запрос:

 {
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "bool": {
                  "filter": {
                    "range": {
                      "createdDate": {
                        "gte": "now-3y",
                        "lte": "now"
                      }
                    }
                  },
                  "must_not": {
                    "exists": {
                      "field": "updatedDate"
                    }
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "filter": {
              "range": {
                "updatedDate": {
                  "gte": "now-3y",
                  "lte": "now"
                }
              }
            }
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}
 

Результат поиска:

 "hits": [
      {
        "_index": "64965551",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.0,
        "_source": {
          "createdDate": "2020-08-15T00:00:00Z"
        }
      },
      {
        "_index": "64965551",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.0,
        "_source": {
          "createdDate": "2019-08-15T00:00:00Z"
        }
      },
      {
        "_index": "64965551",
        "_type": "_doc",
        "_id": "5",
        "_score": 0.0,
        "_source": {
          "updatedDate": "2018-08-15T00:00:00Z",
          "createdDate": "2020-09-15T00:00:00Z"
        }
      }
    ]