哪个DSL适用于执行预过滤查询?

时间:2015-06-02 16:11:54

标签: elasticsearch

我回顾了一些我保存的查询,看来我已经设法以三种不同的方式实现了基本相同的查询。它们都返回相同的数据,但哪一个是“正确的”?即,哪一个不包含多余的代码并且性能最佳?

选项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 个答案:

答案 0 :(得分:1)

根据您的评论,我会选择第2个选项,但使用简单的term过滤器代替match,而过滤器中不允许使用{ "query": { "filtered": { "filter": { "bool": { "must": [ { "term": { "event": "eventname" } }, { "range": { "@timestamp": { "gt": "now-70s" } } } ] } } } }, "aggs": { "myterms": { "terms": { "field": "event" } } } }

<?php 


    $myurl = $_SERVER[REQUEST_URI];

    if (strpos($myurl, '?') !== false) 
    {
        $myurl = substr($myurl, 0, strpos($myurl, '?'));
    }


    if ($myurl == "/index.php")
        echo '<title>My index title</title>
                <meta name="description" content="This is an example of a meta description.">';
    else if ($myurl == "/services.php")
        echo '<title>My service title</title>
                <meta name="description" content="This is an example of a meta description.">';

?>