Вы мало что сказали о своей структуре данных, но я заключаю из вашего вопроса, что у вас есть 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" }
, чтобы все значение обрабатывалось как один термин, а не анализировалось в отдельные термины