DSL结构化查询

2018-08-14  本文已影响27人  小七奇奇

前言

<p><object style="display: block; position: absolute; top:10px; left:500px;" width="340" height="80" data="http://music.163.com/style/swf/widget.swf?sid=175206&type=2&auto=0&width=320&height=66" type="application/x-shockwave-flash"></object></p>
<blockquote>
ES提供了丰富多彩的查询接口,可以满足各种各样的查询要求。更多内容请参考:<a href="">ELK修炼之道</a>
</blockquote>

Query DSL结构化查询

举个例子

GET _search
{
    "query": {
        "bool": {
            "must": [
                { "match": { "title": "Search" }},
                { "match": { "content": "Elasticsearch" }}
            ],
            "filter": [
                { "term": { "status": "published" }},
                { "range": { "publish_date": { "gte": "2015­01­01" }}}
            ]
        }
    }
}

<p style="color:red">查询的分类 </p>

Leaf query Cluase 叶子查询(简单查询)
这种查询可以单独使用,针对指定的字段查询指定的值。

Compound query clauses 复杂查询
复杂查询可以包含叶子或者其它的复杂查询语句,用于组合成复杂的查询语句,比如not, bool等。

**
查询虽然包含这两种,但是查询的行为还与查询的执行环境有关,不同的执行环境,查询操作也不一样。**
查询的行为取决于他们所在的查询上下文,包括Query查询上下文和Filter查询上下文。

查询与过滤

举个简单的例子:

  1. title字段包含关键词"search"
  2. content字段包含关键词"elasticsearch"
  3. status字段存在精确词"published"
  4. publish_date字段包含一个日期由2015年1月1日起
GET _search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}

性能差异
使用过滤语句得到的结果集———一个简单的文档列表,快速匹配运算并存入内存是非常方便的,每个文档仅需1个字节。这些缓存的过滤结果集与后续请求的结合使用时非常高效的。
查询语句不仅要查找相匹配的文档,还需要计算每个文档的相关性,所以一般来说查询语句要比过滤语句更耗时,并且查询结果也不可缓存。
幸亏有了倒排索引,一个只匹配少量文档的简单查询语句在百万级文档中的查询效率会与一条经过缓存的过滤语句旗鼓相当,甚至略占上风。但是一般情况下,一条经过缓存的过滤查询要远胜一条查询语句的执行效率。

总结

  1. Query查询上下文中,查询操作会根据查询的结果进行相关性分值计算,用于确定相关性。分值越高,返回的结果越靠前。
  2. Filter过滤器上下文中,查询不会计算相关性分值,也不会对结果进行排序。
  3. 过滤器上下文中,查询的结果可以被缓存。
  4. <code style="color:red">以后博客中提到的查询就是在Query查询上下文,过滤就是指filter过滤器上下文。</code>
  5. 原则上来说,使用查询语句做全文本搜索或其他需要进行相关性评分的时候,剩下的全部用过滤语句

参考

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html

上一篇下一篇

猜你喜欢

热点阅读