Несколько фильтров и совокупность результатов поиска elastics
Как я могу использовать фильтр в связи с агрегатом в elasticsearch?
Официальная документация дает только тривиальные примеры для filter и для aggregations и никаких формальных описание запроса dsl - сравните его, например с документацией postgres.
Через опрос я нашел следующий запрос, который принят elasticsearch (без ошибок синтаксического анализа), но игнорирует данные фильтры:
{
"filter": {
"and": [
{
"term": {
"_type": "logs"
}
},
{
"term": {
"dc": "eu-west-12"
}
},
{
"term": {
"status": "204"
}
},
{
"range": {
"@timestamp": {
"from": 1398169707,
"to": 1400761707
}
}
}
]
},
"size": 0,
"aggs": {
"time_histo": {
"date_histogram": {
"field": "@timestamp",
"interval": "1h"
},
"aggs": {
"name": {
"percentiles": {
"field": "upstream_response_time",
"percents": [
98.0
]
}
}
}
}
}
}
Некоторые люди предлагают использовать query
вместо filter
. Но официальная документация обычно рекомендует напротив для фильтрации точных значений. Другая проблема с query
: в то время как фильтры предлагают and
, query
нет.
Может кто-нибудь указать мне на документацию, блог или книгу, в которых описываются записи нетривиальных запросов: по крайней мере, совокупность плюс несколько фильтров.
Ответы
Ответ 1
Я закончил использование агрегация фильтров - не отфильтрованный запрос. Итак, теперь у меня есть 3 вложенных элемента aggs.
Я также использую bool
фильтр вместо and
как рекомендуемый @alex-brasetvik из-за http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/
Моя окончательная реализация:
{
"aggs": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"_type": "logs"
}
},
{
"term": {
"dc": "eu-west-12"
}
},
{
"term": {
"status": "204"
}
},
{
"range": {
"@timestamp": {
"from": 1398176502000,
"to": 1400768502000
}
}
}
]
}
},
"aggs": {
"time_histo": {
"date_histogram": {
"field": "@timestamp",
"interval": "1h"
},
"aggs": {
"name": {
"percentiles": {
"field": "upstream_response_time",
"percents": [
98.0
]
}
}
}
}
}
}
},
"size": 0
}
Ответ 2
Поместите свой фильтр в filtered
-query.
Верхний уровень filter
предназначен для фильтрации только поисковых запросов, а не граней/агрегатов. Это было переименовано в post_filter
в 1.0 из-за этой довольно распространенной путаницы.
Кроме того, вы можете посмотреть в этом сообщении о том, почему вы часто хотите использовать bool
, а не and
/or
: http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/
Ответ 3
more on @geekQ answer: чтобы поддерживать строку фильтра с пробелом char, для поиска в многостраничном поиске используйте ниже:
{ "aggs": {
"aggresults": {
"filter": {
"bool": {
"must": [
{
"match_phrase": {
"term_1": "some text with space 1"
}
},
{
"match_phrase": {
"term_2": "some text with also space 2"
}
}
]
}
},
"aggs" : {
"all_term_3s" : {
"terms" : {
"field":"term_3.keyword",
"size" : 10000,
"order" : {
"_term" : "asc"
}
}
}
}
} }, "size": 0 }