ElastaticSearch-----es的DSL查询与过滤

DSL查询:

DSL全称Domain Specific language,即特定领域专用语言。

DSL,把查询条件写在JSON里面,然后进行相关的查询。

DSL主要分为查询DSL(query DSL)和过滤DSL(filter DSL)。

query DSL:

query match : 分词后才进行匹配。

GET 索引名称/_search
{
  "query" : { "match" : { "字段": "匹配内容" }}
}
  • multi_match 查询:

multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个:

{
    "multi_match": {
        "query":    "查询内容",
        "fields":   [ "字段名称", "字段名称" ]
    }
}

filter DSL:

在过滤器Filter中,查询会回答这个问题——“这个文档匹不匹配?”

答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。

过滤上下文 是在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter

另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。

  • term 过滤 :

term主要用于精确匹配哪些值.格式如下:

{
  "query": {
    "term": {
      "字段名称": "匹配内容"
    }
  }
}

  • terms 过滤:

terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配。
terms ,类似于mysql中的in关键字。

格式如下:

{
  "query": {
    "terms": {
      "字段名称": [
        "匹配内容",
        "匹配内容"
      ]
    }
  }
}
  • range 过滤:

range过滤允许我们按照指定范围查找一批数据:

{
    "range": {
        "age": {
            "gte":  20,
            "lt":   30
        }
    }
}

范围操作符包含:

    gt : 大于。greater than 
    gte: 大于等于。greater than or equal
    lt : 小于。 less than
    lte: 小于等于。 less than or equal 
    from 和to : from类似于gte,to类似于lte

格式如下:

{
  "query": {
    "range": {
      "字段名称": {
        "gt": 3
      }
    }
  } 
  • filter过滤:
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "字段名称": {
            "gte": 10,
            "lt": 27
          }
        }
      }
    }
  }
}

  • bool 查询/过滤:如果要执行多个关键词的and、or搜索,必须使用布尔查询过滤。

bool 查询/过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含以下操作符:

    must : 多个查询条件的完全匹配,相当于 and。
    must_not : 多个查询条件的相反匹配,相当于 not。
    should : 至少有一个查询条件匹配, 相当于 or。 

bool查询,如下所示:

  "query": { 
    "bool": { 
      "must": [
        { "match": { "字段名称": "匹配内容" }}, 
        { "match": { "字段名称": "匹配内容" }}  
      ]
	 }
   }		

bool过滤,如下所示:

{
    "bool": {
        "must":     { "term": { "字段名称": "匹配内容" }},
        "must_not": { "term": { "字段名称": "匹配内容" }},
        "should": [
                    { "term": { "字段名称": "匹配内容" }},
                    { "term": { "字段名称": "匹配内容" }}
        ]
    }
}
  • exist:字段是否存在。类似于 mysql中的 IS NOT NULL
{
  "query": {
      "bool": {
        "must": [
           { "exists" : {"field" : "color" } }
        ]
      }
   } 
}
  • missing : 跟exist相反。类似于mysql中的 IS NULL

其他查询

  • es 查询索引别名:
GET /索引名称/_alias/* 
  • es 添加/更新别名:
PUT /索引名称/_alias/别名名称

filter DSL和query DSL的区别:

而filter是精确匹配(exact-values)。而query是全文检索(full-text)。

filter只返回是否匹配,而query会返回相关度的分数score,并进行排序。

filter会进行缓存,query不会。

filter更快一些。query相对较慢。

如果你的查询是范围和类型比较广的,用filter; 如果是要求比较精准的,就用query来查询。

  • 同时使用query DSL和filter DSL,如下所示:
"query": {
        "filtered": {
            "query":  { "match": { "字段名": "匹配内容" }},
            "filter": { "term": { "字段名": "匹配内容" }}
        }
    }

参考资料:

http://blog.itpub.net/29715045/viewspace-2653369/

https://blog.csdn.net/qq_29580525/article/details/80908523

https://www.cnblogs.com/ghj1976/p/5293250.html

posted on 2020-10-19 23:28  乐之者v  阅读(1079)  评论(0编辑  收藏  举报

导航