Как выполнить запрос на поиск в диапазоне дат с учетом нескольких дат на документ? - PullRequest
4 голосов
/ 11 ноября 2011

Я использую ElasticSearch, чтобы индексировать темы форума и отвечать на сообщения. С каждым сообщением связано поле даты. Я хотел бы выполнить запрос, включающий диапазон дат, который вернет темы, содержащие записи, соответствующие диапазону дат. Я рассмотрел использование вложенного отображения, но в документах говорится, что эта функция является экспериментальной и может привести к неточным результатам.

Какой лучший способ сделать это? Я использую Java API.

1 Ответ

12 голосов
/ 12 ноября 2011

Вы мало что сказали о своей структуре данных, но я заключаю из вашего вопроса, что у вас есть post объекты, которые содержат поле date и, предположительно, поле thread_id, т.е. какой-то способ идентификации какой теме принадлежит сообщение?

У вас также есть thread объект, или ваш thread_id достаточен?

В любом случае, ваша заявленная цель - вернуть список тем, в которых есть сообщения в определенном диапазоне дат. Это означает, что вам нужно сгруппировать ваши темы (вместо того, чтобы возвращать один и тот же thread_id несколько раз для каждого сообщения в диапазоне дат).

Эта группировка может быть выполнена с помощью facets .

Таким образом, запрос в JSON будет выглядеть так:

curl -XGET 'http://127.0.0.1:9200/posts/post/_search?pretty=1&search_type=count'  -d '
{
   "facets" : {
      "thread_id" : {
         "terms" : {
            "size" : 20,
            "field" : "thread_id"
         }
      }
   },
   "query" : {
      "filtered" : {
         "query" : {
            "text" : {
               "content" : "any keywords to match"
            }
         },
         "filter" : {
            "numeric_range" : {
               "date" : {
                  "lt" : "2011-02-01",
                  "gte" : "2011-01-01"
               }
            }
         }
      }
   }
}
'

Примечание:

  • Я использую search_type=count, потому что я на самом деле не хочу, чтобы сообщения возвращались, только thread_id s
  • Я указал, что хочу 20 наиболее часто встречающихся thread_id с (size: 20). По умолчанию будет 10
  • Я использую numeric_range для поля date, потому что даты обычно имеют много разных значений, а фильтр numeric_range использует другой подход к фильтру range, что делает его работу лучше в этой ситуации
  • Если ваши thread_id выглядят как how-to-perform-a-date-range-elasticsearch-query, то вы можете использовать эти значения напрямую. Но если у вас есть отдельный thread объект, то вы можете использовать multi-get API для получения этих
  • ваше поле thread_id должно быть отображено как { "index": "not_analyzed" }, чтобы все значение обрабатывалось как один термин, а не анализировалось в отдельные термины
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...