ES查询常用语法

这篇具有很好参考价值的文章主要介绍了ES查询常用语法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. ElasticSearch之查询返回结果各字段含义

2. match 查询

3. term查询

4. terms 查询

5. range 范围

6. 布尔查询

6.1 filter加快查询效率的原因

7. boosting query(提高查询)

8. dis_max(最佳匹配查询)

9. 分页

10. 聚合查询【内含实际的demo】

1. ElasticSearch之查询返回结果各字段含义

执行命令:索引库名称/_search

空搜索的结果为:

{
  "took": 2,		# 该命令请求花费了多长时间,单位:毫秒。
  "timed_out": false,		# 搜索是否超时
  "_shards": {		# 搜索分片信息
    "total": 3,		# 搜索分片总数
    "successful": 3,		# 搜索成功的分片数量
    "skipped": 0,		# 没有搜索的分片,跳过的分片
    "failed": 0		# 搜索失败的分片数量
  },
  "hits": {		# 搜索结果集。需要的一切数据都是从hits中获取
    "total": 21798,		# 返回多少条数据
    "max_score": 1,		#返回结果中,最大的匹配度分值
    "hits": [		# 默认查询前十条数据,根据分值降序排序,这里为了节省地方,把默认查询的前十条数据删了9条,只剩下一条数据
      {
        "_index": "",		# 索引库名称
        "_type": "",		# 类型名称
        "_id": "",		# 该条数据的id
        "_score": 1,		# 关键字与该条数据的匹配度分值
        "_routing": "",		# routing参数是一个可选参数,默认使用文档的_id值,用于计算文档所属分片
        "_source": {		# 索引库中类型,返回结果字段,不指定的话,默认全部显示出来
          "id": 1,
          "orderNo": "",
          "appId": "",
          "componentAppId": "",
          "settleNo": "",
          "outSettleNo": "",
          "settleAmount": 5,
          "orderAmount": 7,
          "settleStatus": 3,
          "paymentChannel": 1,
          "version": 2,
          "settleTime": ,
          "createTime": ,
          "updateTime": ,
          "promotionAccountId": "",
          "invoiceStatus": 1,
          "promotionTypeValue": 0,
          "commissionRateFeeCentAmount": 0,
          "commissionChargeFeeCentAmount": 0,
          "promotionFeeCentAmount": 2,
          "developerPromotionFeeCentAmount": 0,
          "promotionType": ""
        }
      }
    ]
  }
}
  • 按照从上到下的顺序,一共四个返回值,took,timed_out,_shards,hits。
  • took
    • 该命令请求花费了多长时间,单位:毫秒。
  • timed_out
    • 搜索是否超时。
  • shards
    • 搜索分片信息。
    • total
      • 搜索分片总数。
    • successful
      • 搜索成功的分片数量。
    • skipped
      • 没有搜索的分片,跳过的分片。
    • failed
      • 搜索失败的分片数量。
  • hits
    • 搜索结果集,需要的一切数据都是从hits中获取。
    • total
      • 返回多少条数据。
    • max_score
      • 返回结果中,最大的匹配度分值。
    • hits
      • 默认查询前十条数据,根据分值降序排序。
    • _index
      • 索引库名称。
    • _type
      • 类型名称。
    • _id
      • 该条数据的id。
    • _score
      • 关键字与该条数据的匹配度分值。
    • _source
      • 索引库中类型,返回结果字段,不指定的话,默认全部显示出来。

2. match 查询

  • 匹配查询 match 是个 核心 查询。无论需要查询什么字段, match 查询都应该会是首选的查询方式。它是一个高级 全文查询 ,这表示它既能处理全文字段(包括支持分词的字段),又能处理精确字段

  • match 查询主要的应用场景就是进行全文搜索

{
  "query": {
    "match": {
      "appId": "xxxx"
    }
  }
}

match本质上是对term组合,所以上面的语句换成term依然能够执行

{
  "query": {
    "term": {
      "appId": "xxxx"
    }
  }
}

3. term查询

  • term 查询, 可以用它处理数字(numbers)、布尔值(Booleans)、日期(dates)以及文本(text)

  • 用 trem 搜索字符串时 要将字段设置成 not_analyzed 无需分析的。不然es会将字符串进行分词,分词结果建立索引,在用trem进行精确查找时找不到任何文档

  • 对应的 QueryBuilder class 是TermQueryBuilder

  • 具体方法是 QueryBuilders.termQuery()

{
  "query": {
    "term": {
      "appId": "xxxx"
    }
  }
}

4. terms 查询

  • terms 查询允许指定多个值进行匹配。如果这个字段包含了指定值中的任何一个值,就表示该文档满足条件。 比如我们想要查找价格字段值为 $20 或 $30 的文档则可以使用trems;

  • 按照读个分词term匹配,它们是or的关系

  • 对应的 QueryBuilder class 是 TermsQueryBuilder

  • 具体方法是 QueryBuilders.termsQuery()
{
  "query": {
    "terms": {
      "appId": ["xxxx", "xxxx"]
    }
  }
}

5. range 范围

  • 常常被用在数字或者日期范围的查询

Search Query

QueryBuilder Class

Method in QueryBuilders

Range

RangeQueryBuilder

QueryBuilders.rangeQuery()

{
  "query": {
    "range": {
      "createTime": {
        "gte": 1661409996661,
        "lte": 1661409996661
      }
    }
  }
}

6. 布尔查询

  • 通过布尔逻辑将较小的查询组合成较大的查询。
  • 概念
    • Bool查询语法有以下特点
      • 子查询可以任意顺序出现
      • 可以嵌套多个查询,包括bool查询
      • 如果bool查询中没有must条件,should中必须至少满足一条才会返回结果。
    • bool查询包含四种操作符,分别是must,should,must_not,filter。他们均是一种数组,数组里面是对应的判断条件。
      • must: 必须匹配。贡献算分
      • must_not:过滤子句,必须不能匹配,但不贡献算分
      • should: 选择性匹配,至少满足一条。贡献算分
      • filter: 过滤子句,必须匹配,但不贡献算分,所以比must会更快!
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "appId": "xxxx"
          }
        },
        {
          "term": {
            "paymentChannel": 1
          }
        },
        {
          "term": {
            "settleStatus": 3
          }
        },
        {
          "term": {
            "promotionAccountId": ""
          }
        },
        {
          "range": {
            "createTime": {
              "from": 1658741630780,
              "to": 1661420030780,
              "include_lower": true,
              "include_upper": true
            }
          }
        }
      ]
    }
  }
}

6.1 filter加快查询效率的原因

  • query context

    • query context关注的是,文档到底有多匹配查询的条件,这个匹配的程度是由相关性分数决定的,分数越高自然就越匹配。所以这种查询除了关注文档是否满足查询条件,还需要额外的计算相关性分数.

  • filter context

    • filter context关注的是,文档是否匹配查询条件,结果只有两个,是和否。没有其它额外的计算。它常用的一个场景就是过滤时间范围。

    • 并且filter context会自动被ES缓存结果,效率进一步提高。

    • 对于bool查询,must使用的就是query context,而filter使用的就是filter context。

    • 我们可以通过一个示例验证下。继续使用第一节的例子,我们通过kibana自带的search profiler来看看ES的查询的详细过程。

  • 那么 filter 的 cache 是怎么做的呢?

    • ES 会构建一个文档匹配过滤器的位集 bitset(用来标识一个文档对一个 filter 条件是否匹配,如果匹配就是 1,不匹配就是 0),下次再有这个 filter 条件过来的时候就不用重新扫描倒排索引,反复生成 bitset,可以大幅度提升性能,另外当添加或更新文档时,这个 filter 的位集 bitset 也会更新。

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "appId": "xxxx"
          }
        },
        {
          "term": {
            "paymentChannel": 1
          }
        },
        {
          "term": {
            "settleStatus": 3
          }
        },
        {
          "term": {
            "promotionAccountId": ""
          }
        }
      ],
      "filter": {
        "range": {
          "createTime": {
            "from": 1658741630780,
            "to": 1661420030780,
            "include_lower": true,
            "include_upper": true
          }
        }
      }
    }
  }
}

7. boosting query(提高查询)

  • 用来控制(提高或降低)复合查询中子查询的权重。

  • 不同于bool查询,bool查询中只要一个子查询条件不匹配那么搜索的数据就不会出现。而boosting query则是降低显示的权重/优先级(即score)。

  • 比如搜索逻辑是 name = 'apple' and type ='fruit',对于只满足部分条件的数据,不是不显示,而是降低显示的优先级(即score)

  • ~positive(积极的,加分):

    • 只有匹配上positive的查询的内容,才会被放到返回的结果集中。

  • ~negative(消极的,减分):

    • 如果匹配上positive并且也匹配上了negative,就可以降低这样的文档score。

  • ~negative_boost:

    • 指定系数,必须小于1.0 ,那么匹配到的内容会将分数乘以当前系数;(这是个系数,因为你要控制分数,那要怎么控制呢?就是乘以系数来控制分数大小)

{
  "query": {
    "boosting": {
      "positive": {
        "term": {
          "appId": "xxxx"
        }
      },
      "negative": {
        "term": {
          "orderNo": "xxxx"
        }
      },
      "negative_boost": 0.5
    }
  }
}

8. dis_max(最佳匹配查询)

  • dis_max query

    • 叫做分离最大化查询,它会将任何与查询匹配的文档都作为结果返回,但是只是将其中最佳匹配的评分作为最终的评分返回。

  • dis_max 条件的计算分数

    • 分数 = 第一个匹配条件分数 + tie_breaker * 第二个匹配的条件的分数 ...

  "query": {
    "dis_max": {
      "queries": [
        {
          "term": {
            "appId": "xxxx"
          }
        },
        {
          "term": {
            "paymentChannel": 1
          }
        },
        {
          "range": {
            "createTime": {
              "from": 1658741630780,
              "to": 1661420030780,
              "include_lower": true,
              "include_upper": true
            }
          }
        }
      ],
      "tie_breaker": 0
    }
  }

9. 分页

  • 通过 from 和 size 就可以执行分页查询。from 指明了分页查询返回的结果的起始位置,而size参数则指明了分页查询的页容量。

{
  "from": 0,
  "size": 1,
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "appId": "xxxx"
          }
        },
        {
          "term": {
            "paymentChannel": 1
          }
        },
        {
          "term": {
            "settleStatus": 3
          }
        },
        {
          "term": {
            "promotionAccountId": ""
          }
        },
        {
          "range": {
            "createTime": {
              "from": 1658741630780,
              "to": 1661420030780,
              "include_lower": true,
              "include_upper": true
            }
          }
        }
      ]
    }
  }
}

10. 聚合查询【内含实际的demo】

根据appId查询昨日结算成功的指定支付渠道的结算总金额文章来源地址https://www.toymoban.com/news/detail-407489.html

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "appId": "xxxx"
          }
        },
        {
          "term": {
            "paymentChannel": 1
          }
        },
        {
          "term": {
            "settleStatus": 3
          }
        },
        {
          "term": {
            "promotionAccountId": ""
          }
        },
        {
          "range": {
            "createTime": {
              "from": 1658741630780,
              "to": 1661420030780,
              "include_lower": true,
              "include_upper": true
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "total_amount": {
      "sum": {
        "field": "settleAmount"
      }
    }
  },
  "size": 0
}

到了这里,关于ES查询常用语法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch基础学习-常用查询和基本的JavaAPI操作ES

    Elasticsearch是一个基于 lucene 、分布式、通过Restful方式进行交互的 近实时搜索 平台框架。 ELK技术栈是Elasticsearch、Logstash、Kibana三大开元框架首字母大写简称。 而Elasticsearch 是一个 开源的高扩展的分布式全文搜索引擎 , 是整个 ELK技术栈的核心。 Elasticsearch是一个基于lucene、分

    2024年02月11日
    浏览(56)
  • DB SQL 转 ES DSL(支持多种数据库常用查询、统计、平均值、最大值、最小值、求和语法)...

    1. 简介   日常开发中需要查询 Elasticsearch 中的数据时,一般会采用 RestHighLevelClient 高级客户端封装的API。项目中一般采用一种或多种关系型数据库(如: Mysql 、 PostgreSQL 、 Oracle 等) + NoSQL(如: Elasticsearch )存储方案;不同关系数据库可以采用 Mybatis-Plus 方案屏蔽数据库的方言

    2024年01月17日
    浏览(50)
  • ES 聚合分组查询 语法

    ES 聚合分组查询的语法如下: 其中 index 是索引名称, size 设置为 0 意味着只返回聚合结果而不返回文档。 aggs 字段是聚合查询的核心部分,这里以 group_by_field 为例进行分组查询,其中 terms 指定了分组的字段名称。 这样的查询会返回按照 field_name 字段进行分组后每个分组的

    2024年02月11日
    浏览(38)
  • 【DSL】ES+DSL 查询语法

    一、前言 工作中遇到ES的查询问题,由于业务方给的条件不清晰,有些查询无法实现,需要用到DSL语法查询实现,很久没用生疏了,借此机会复习下。 二、定义 1.基本介绍 Elasticsearch(简称为ES ),一个开源的分布式搜索和分析引擎,主要用于处理大量数据并提供快速、实时

    2024年02月12日
    浏览(44)
  • ES各种查询语法及响应结果

    目录 查询 创建 删除请求 1. 删除索引  数据类型 一、创建索引     1.1 创建book_test索引     1.2 查看索引映射     1.3 添加文档记录     1.4 查询文档     1.6 删除文档中某一条数据 二、查询语法 2.1 termterms查询 2.2 match查询属于高层查询,他会根据你查询的字段类型不一样

    2023年04月09日
    浏览(41)
  • cmd常用命令:更换文件夹、切换路径、查看目录和返回根目录和子目录

    打开cmd:快捷键 Win+R,输入cmd 打开cmd之后,默认是在C:Users电脑路径 文件夹中 更换磁盘:输入D:,然后回车 +dir查看当前目录 cd…可以返回上一级目录 cd 返回到根目录 输入 cd 文件夹名, 可以进入子文件夹 例如输入 cd Program Files/Java/jdk-19/ 【注意反斜杠】 cmd命令打开及切换目

    2023年04月18日
    浏览(79)
  • ES高级查询语法DSL实战 - 第504篇

    历史文章( 文章 累计500+) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《国内最全的Spring Boot系列之七》 E

    2024年04月27日
    浏览(49)
  • ES基本查询语法_Kibana操作(持续更新)

    1. ES查询索引下所有的数据 2. ES单字段精确查询 3. ES多字段精确查询(默认Kibana查询最多展示10条记录,可以通过设置size来展示更多匹配到的数据) 4. ES数组字段精确查询 5. ES日期范围查询(大写HH表示24小时制) 6. 查询ES索引下的数据量 7. 查询ES索引下的mapping关系 7. 查询E

    2024年02月11日
    浏览(64)
  • ElasticSearch高级查询语法

    当数据写入ES时,数据将会通过“分词”被切分为不同的term,ES将term与其对应的文档列表建立一种映射关系,这种结构就是倒排索引。如下图所示: 为了进一步提升索引的效率,ES在term的基础上利用term的前缀或者后缀构建了term index,用于对term本身进行索引,ES实际的索引结

    2024年01月20日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包