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

  • 相关阅读:
    Linux 禁用笔记本触摸板
    Linux 下安装android
    关于JAVA多线程的那些事__初心者
    ADT下开发环境的配置--个人配置啦 Eclipse Color Themes
    关于权限系统的一些思考
    关于线程安全的单例模式的讨论
    说下Fedora下把SpiderMonkey放入Eclipse内编译的过程
    基于Eclipse构建Hadoop源码阅读环境
    Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别
    CentOS6.5安装配置
  • 原文地址:https://www.cnblogs.com/expiator/p/13843957.html
Copyright © 2011-2022 走看看