ES查询常用语法

news/2024/11/20 21:32:41/

目录

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": "ks707065143182458884"}}
}

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

{"query": {"term": {"appId": "ks707065143182458884"}}
}

3. term查询

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

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

  • 对应的 QueryBuilder class 是TermQueryBuilder

  • 具体方法是 QueryBuilders.termQuery()

{"query": {"term": {"appId": "ks707065143182458884"}}
}

4. terms 查询

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

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

  • 对应的 QueryBuilder class 是 TermsQueryBuilder

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

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": "ks707065143182458884"}},{"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": "ks707065143182458884"}},{"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": "ks707065143182458884"}},"negative": {"term": {"orderNo": "122082511151413374156"}},"negative_boost": 0.5}}
}

8. dis_max(最佳匹配查询)

  • dis_max query

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

  • dis_max 条件的计算分数

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

  "query": {"dis_max": {"queries": [{"term": {"appId": "ks707065143182458884"}},{"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": "ks707065143182458884"}},{"term": {"paymentChannel": 1}},{"term": {"settleStatus": 3}},{"term": {"promotionAccountId": ""}},{"range": {"createTime": {"from": 1658741630780,"to": 1661420030780,"include_lower": true,"include_upper": true}}}]}}
}

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

根据appId查询昨日结算成功的指定支付渠道的结算总金额

{"query": {"bool": {"must": [{"term": {"appId": "ks707065143182458884"}},{"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
}


http://www.ppmy.cn/news/8648.html

相关文章

6.6 函数匹配

文章目录确认候选函数和可行函数寻找最佳匹配含有多个形参的函数匹配实参类型转换需要类型提升和算术类型转换的函数在大多数情况下,我们容易确定某次调用应该选用哪个重载函数。然而,当几个重载函数的形参数量相等以及某些形参的类型可以由其他类型转换…

数值优化之凸集

本文ppt来自深蓝学院《机器人中的数值优化》 目录 1 凸集的定义 2 凸集的运算 1 凸集的定义 集合中任意两点连线形成的线段属于这个集合,这个集合是凸集。 注意:是否是凸集,集合的边界是否属于这个集合很重要 这涉及到构造最小凸包的问题…

【LeetCode每日一题】——263.丑数

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数学 二【题目难度】 简单 三【题目编号】 263.丑数 四【题目描述】 丑数 就是只包含质因数 …

MySQL补齐函数LPAD和RPAD之SQLite解决方案

工作中经常需要对数据进行清洗,并对个别字段进行格式化处理,像 字符串左右补齐。MySQL数据库自带有LPAD()、RPAD(),而SQLite数据库没有的相应函数,需要自己转换。 目录 1、MySQL数据库 1.1、MySQL左右补全函数 1.2、实践验证 …

Java工具——MySQL介绍与安装

Java工具——MySQL介绍与安装MySQL数据库介绍1. 简介2. MySQL发展历史MySQL数据库安装1. 下载安装包2. 安装3. 配置环境变量MySQL数据库介绍 1. 简介 MySQL是应用最广泛、普及度最高的开源关系型数据库,MySQL由瑞典MySQL AB公司开发,目前属于Oracle旗下…

【C++】-- 哈希(上万字详细配图配代码从执行一步步讲解)

目录 哈希 常见哈希函数 除留余数法 哈希冲突 哈希冲突解决 闭散列 a、线性探测 插入 查找 删除 线性探测的实现代码 b、二次探测 二次探测的实现 开散列 开散列实现 插入 查找 删除 析构函数 代码汇总 哈希 常见哈希函数 直接定址法 -- (常用)-- 不存在哈…

设计 | 分享5个好用的PPT模板网站

第一PPT 这个老牌的模板网站了,全站都是免费下载,还是不错的 但是素材质量嘛,免费所以不太高。 第一PPT下载https://www.1ppt.com/ 模板狗 这个是最近发现的一个网站,其中内容比较精美。 而且不用开会员也能单独购买&#x…

哈希表题目:同构字符串

文章目录题目标题和出处难度题目描述要求示例数据范围解法思路和算法代码复杂度分析题目 标题和出处 标题:同构字符串 出处:205. 同构字符串 难度 3 级 题目描述 要求 给定两个字符串 s\texttt{s}s 和 t\texttt{t}t,判断它们是否是同…