2015-06-02 3 views
1

Я просмотрел несколько запросов, которые я сохранил, и, похоже, мне удалось достичь по существу одного и того же запроса тремя различными способами. Все они возвращают одни и те же данные, но какой из них «правильный»? 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.

+1

Вы уверены, что сможете выбрать вариант 2? 'match' не может использоваться в фильтрах, только в запросах? Вариант 2 должен бросить 'org.elasticsearch.search.SearchParseException'. «Match» в опции 3 работает только потому, что вы завернули его в фильтр 'query'. (Я знаю, что их именование может иногда путать). Тогда это зависит от того, нужно ли вам точное совпадение с значениями 'event' и' user', или больше после поиска текста. – Val

+0

Ну, это немного сужает его. «Событие»: «eventname» должно быть просто простым сравнением, без забивки и т. П. Какой фильтр я должен использовать? – pjcard

ответ

1

Основываясь на ваших комментариях, я бы выбрал вариант 2, но с простым фильтром term для стартеров вместо match, который не разрешен фильтрами.

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "event": "eventname" 
       } 
      }, 
      { 
       "range": { 
       "@timestamp": { 
        "gt": "now-70s" 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "myterms": { 
     "terms": { 
     "field": "event" 
     } 
    } 
    } 
} 
Смежные вопросы