Elasticsearch DSL中Query与Filter的区别

Elasticsearch支持很多查询方式,除了通过9300(默认)端口通过TCP协议进行查询,另一种就是DSL,它是把请求写在JSON里面,然后进行相关查询。

一个DSL例子

GET _search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "name":   "Jim" }}, 
        { "match": { "city": "Guangzhou" }}  
      ],
      "filter": [ 
        { "term":  { "weight": "60" }}, 
        { "range": { "age": { "gte": "18" }}} 
      ]
    }
  }
}

查询的种类

Elasticsearch中的DSL主要由两部分组成:

Leaf query Cluase 叶查询子句:
这种查询可以单独使用,针对某一特定的字段查询特定的值,比如match、term、range等

Compound query Cluase复合查询子句:
这种查询配合其他的叶查询或者复合查询,用于在逻辑上,组成更为复杂的查询,比如bool


Query与Filter

查询在Query查询上下文和Filter过滤器上下文中,执行的操作是不一样的:

1、查询上下文:是在使用query进行查询时的执行环境,比如使用search的时候。
在查询上下文中,查询会回答这个问题——“这个文档是否匹配这个查询,它的相关度高么?
ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。即使lucene使用倒排索引,对于某个搜索的分值计算还是需要一定的时间消耗。

2、过滤器上下文:在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter
在过滤器上下文中,查询会回答这个问题——“这个文档是否匹配?
它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。
另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。

总而言之:
1 查询上下文:查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;

2 过滤器上下文:查询操作仅判断是否满足查询条件,不会计算得分,查询的结果可以被缓存。

所以,根据实际的需求是否需要获取得分,考虑性能因素,选择不同的查询子句。

相关推荐