• 三、elasticsearch文档高级查询Query DSL


    一、数据准备

    批量操作_bulk

    https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json

    执行

    POST bank/account/_bulk
    json数据

    二、Query DSL操作

    1.格式

    GET bank/_search
    {
      "query": {
        "match_all": {}
      },
      "from": 0,
      "size": 5,
      "sort": [
        {
          "account_number": {
            "order": "desc"
          }
        }
      ]
    }

    match_all查询类型【代表查询所有的所有】,es中可以在query中组合非常多的查询类型完成复杂查询;
    除了query参数之外,我们可也传递其他的参数以改变查询结果,如sort,size;
    from+size限定,完成分页功能;
    sort排序,多字段排序,会在前序字段相等时后续字段内部排序,否则以前序为准;

    2.返回部分字段

    GET bank/_search
    {
      "query": {
        "match_all": {}
      },
      "from": 0,
      "size": 5,
      "sort": [
        {
          "account_number": {
            "order": "desc"
          }
        }
      ],
      "_source": ["balance","firstname"]
    }

    3.term和term

    terms 和 term 查询的机制一样,全文检索字段用match,用于非text字段匹配用term
    terms:是针对一个字段包含多个值
    term : where province =北京
    terms: where province = 北京 or province =? (类似于mysql 中的 in)

    GET bank/_search
    {
    "query": {
    "term": {
    "age": 28
    }
    }
    }

    GET bank/_search
    {
      "query": {
        "terms": {
          "age": [
            28,
            29
          ]
        }
      }
    }

    4.match

    match 查询属于高级查询,会根据你查询字段的类型不一样,采用不同的查询方式
    查询的是日期或者数值,他会将你基于字符串的查询内容转换为日期或数值对待
    如果查询的内容是一个不能被分词的内容(keyword),match 不会将你指定的关键字进行分词
    如果查询的内容是一个可以被分词的内容(text),match 查询会将你指定的内容根据一定的方式进行分词,去分词库中匹配指定的内容
    match 查询,实际底层就是多个term 查询,将多个term查询的结果给你封装到一起

    4.1基本类型(非字符串),精确控制

    GET bank/_search
    {
      "query": {
        "match": {
          "account_number": "20"
        }
      }
    }

    4.1字符串,全文检索: 全文检索,最终会按照评分进行排序,会对检索条件进行分词匹配

    GET bank/_search
    {
      "query": {
        "match": {
          "address": "kings"
        }
      }
    }

    5.Filter【结果过滤】

    并不是所有的查询都需要产生分数,特别是哪些仅用于filtering过滤的文档。为了不计算分数,elasticsearch会自动检查场景并且优化查询的执行。

    GET bank/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "address": "mill"
              }
            }
          ],
          "filter": {
            "range": {
              "balance": {
                "gte": "10000",
                "lte": "20000"
              }
            }
          }
        }
      }
    }

    这里先是查询所有匹配address=mill的文档,然后再根据10000<=balance<=20000进行过滤查询结果

    6.bool用来做复合查询

    复合语句可以合并,任何其他查询语句,包括符合语句。这也就意味着,复合语句之间 可以互相嵌套,可以表达非常复杂的逻辑。

    复合过滤器,将你的多个查询条件 以一定的逻辑组合在一起,

    must:所有条件组合在一起,表示 and 的意思
    must_not: 将must_not中的条件,全部都不匹配,表示not的意思
    should:所有条件用should 组合在一起,表示or 的意思

    #省是 晋城 或者北京
    # 运营商不能是联通
    #smsContent 包含 战士 和的
    {
      "query": {
        "bool": {
          "should": [
            {
              "term": {
                "province": {
                  "value": "晋城"
                }
              }
              
            },
             {
              "term": {
                "province": {
                  "value": "北京"
                }
              }
              
            }
          ],
          "must_not": [
            {
              "term": {
                "operatorId": {
                  "value": "2"
                }
              }
            }
          ],
          "must": [
            {
              "match": {
                "smsContent": "战士"
              }
            },
            {
              "match": {
                "smsContent": "的"
              }
            }
          ]
        }
      }
    }

    6.聚合查询

    聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于SQL Group by和SQL聚合函数。在elasticsearch中,执行搜索返回this(命中结果),并且同时返回聚合结果,把以响应中的所有hits(命中结果)分隔开的能力。这是非常强大且有效的,你可以执行查询和多个聚合,并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的API啦避免网络往返。

    aggs:执行聚合。聚合语法如下:

    "aggs":{
        "aggs_name这次聚合的名字,方便展示在结果集中":{
            "AGG_TYPE聚合的类型(avg,term,terms)":{}
         }
    }
  • 相关阅读:
    springboot 集成jsp
    eclipse 创建 springboot项目
    eclipse 导入别人拷贝过来的工作空间项目
    vue安装及使用
    eclipse配置svn导出项目
    sql为什么用0,1表示男女?在sql语句里转好还是在页面转好?
    svn下载多模块及依赖框架的项目
    django连接sqlserver
    字符编码
    数组希尔排序法
  • 原文地址:https://www.cnblogs.com/panql341/p/14271120.html
Copyright © 2020-2023  润新知