Я просмотрел несколько запросов, которые я сохранил, и, похоже, мне удалось достичь по существу одного и того же запроса тремя различными способами. Все они возвращают одни и те же данные, но какой из них «правильный»? I.e., который не содержит лишнего кода и наиболее эффективен?Какая DSL подходит для выполнения предварительно отфильтрованного запроса?
Вариант 1
{
"query":{
"bool":{
"must":[
{
"match":{
"event":"eventname"
}
},
{
"range":{
"@timestamp":{
"gt":"now-70s"
}
}
}
]
}
},
"aggs":{
"myterms":{
"terms":{
"field":"fieldname"
}
}
}
}
Вариант 2
{
"query":{
"filtered":{
"filter":{
"bool":{
"must":[
{
"match":{
"event":"eventname"
}
},
{
"range":{
"@timestamp":{
"gt":"now-70s"
}
}
}
]
}
}
}
},
"aggs":{
"myterms":{
"terms":{
"field":"fieldname"
}
}
}
}
Вариант 3
{
"query":{
"filtered":{
"query":{
"bool":{
"must":[
{
"match":{
"event":"eventname"
}
},
{
"range":{
"@timestamp":{
"gt":"now-70s"
}
}
}
]
}
}
}
},
"aggs":{
"myterms":{
"terms":{
"field":"fieldname"
}
}
}
}
Если бы я был догадаться, я бы пойти на вариант 2, как другие кажется, что они могут работать как запрос. Но документация довольно запутанна в отношении правильной формы, которую должны выполнять запросы DSL.
Вы уверены, что сможете выбрать вариант 2? 'match' не может использоваться в фильтрах, только в запросах? Вариант 2 должен бросить 'org.elasticsearch.search.SearchParseException'. «Match» в опции 3 работает только потому, что вы завернули его в фильтр 'query'. (Я знаю, что их именование может иногда путать). Тогда это зависит от того, нужно ли вам точное совпадение с значениями 'event' и' user', или больше после поиска текста. – Val
Ну, это немного сужает его. «Событие»: «eventname» должно быть просто простым сравнением, без забивки и т. П. Какой фильтр я должен использовать? – pjcard