zoukankan      html  css  js  c++  java
  • ElastaticSearch学习笔记(二) ----- 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 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配。

    格式如下:

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

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

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

    范围操作符包含:

        gt : 大于
        gte: 大于等于
        lt : 小于
        lte: 小于等于 
        from 和to : from类似于gte,to类似于lte
    

    格式如下:

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

    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": { "字段名": "匹配内容" }}
            }
        }
    
    • 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": { "字段名称": "匹配内容" }}
            ]
        }
    }
    

    其他查询

    • 查询索引别名:
    GET /索引名称/_alias/* 
    

    参考资料:

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

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

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

  • 相关阅读:
    Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法输入日志标题
    Linux下安装oracle数据库提示DISPLAY not set. Please set the DISPLAY and try again。
    redhat 关机注销命令详解
    VirtualBox的四种网络连接方式
    修改RedHat的系统显示时间
    insufficient memory to configure kdump(没有足够的内存)解决方法(待验证、待解决)
    xen坑随笔 heartbeat dpkg垃圾数据库清除
    tomcat 监控脚本
    负载均衡随笔
    GIT命令介绍
  • 原文地址:https://www.cnblogs.com/expiator/p/13843957.html
Copyright © 2011-2022 走看看