--- title: "谈谈 ES 6.8 到 7.10 的功能变迁(3)- 查询方法篇" date: 2025-02-09 lastmod: 2025-02-09 description: "本文介绍了ES 7.10新增的查询方法,包括Interval查询(词项间距查询)、Distance feature查询(时间/地理距离查询)、Pinned查询(文档置顶)和PIT查询(轻量级视图)。每种查询适用于特定场景,可优化业务使用,尤其是PIT查询为深度分页提供了更好方案。" tags: ["Elasticsearch"] summary: "上一篇咱们了解了 ES 7.10 相较于 ES 6.8 新增的字段类型,这一篇我们继续了解新增的查询方法。 Interval 间隔查询: # 功能介绍 # Interval 查询,词项间距查询,可以根据匹配词项的顺序、间距和接近度对文档进行排名。主要解决的查询场景“创建一个多搜索词匹配的查询,同时保留搜索词的顺序”,比 match phrase 更加符合需求场景,查询方法使用比 span 查询更简单。ES 后续版本想用 interval 查询逐步替代 span 查询。 注意事项 # 规则组合 # 可以使用 prefix、wildcard、fuzzy 等规则 通过设置 max_gaps 和 ordered 参数,可以控制词项间的最大间隙和顺序要求。 性能考虑 # 间隔查询比简单的词项匹配更消耗资源 嵌套规则越多,性能开销越大 建议合理使用 maxGaps 参数限制间距 使用限制 # 只能用于 text 字段 不支持跨字段查询 不支持对数值类型字段使用 Distance feature 查询 # 功能说明 # 时间/地理距离特性查询,该查询用于查找更接近被查询日期和地理位置的结果。 日期和位置分别是声明为 date 和 geo_point 数据类型的字段。返回结果的字段值不需要完全等于被查询值,而是按照给定日期或给定位置的进度算分,越是接近被查询值,在相关性得分中被评为更高。" --- 上一篇咱们了解了 ES 7.10 相较于 ES 6.8 新增的字段类型,这一篇我们继续了解新增的查询方法。 ## Interval 间隔查询: ### 功能介绍 Interval 查询,词项间距查询,可以根据匹配词项的顺序、间距和接近度对文档进行排名。主要解决的查询场景“**创建一个多搜索词匹配的查询,同时保留搜索词的顺序**”,比 match phrase 更加符合需求场景,查询方法使用比 span 查询更简单。ES 后续版本想用 interval 查询逐步替代 span 查询。 ### 注意事项 #### 规则组合 - 可以使用 prefix、wildcard、fuzzy 等规则 - 通过设置 **max_gaps 和 ordered** 参数,可以控制**词项间的最大间隙和顺序要求**。 #### 性能考虑 - 间隔查询比简单的词项匹配更消耗资源 - 嵌套规则越多,性能开销越大 - 建议合理使用 maxGaps 参数限制间距 #### 使用限制 - 只能用于 text 字段 - 不支持跨字段查询 - 不支持对数值类型字段使用 ## Distance feature 查询 ### 功能说明 时间/地理距离特性查询,该查询用于**查找更接近被查询日期和地理位置的结果**。 日期和位置分别是声明为 **date 和 geo_point** 数据类型的字段。返回结果的字段值不需要完全等于被查询值,而是按照给定日期或给定位置的进度算分,**越是接近被查询值,在相关性得分中被评为更高**。 ### 字段类型要求 - 日期字段必须是 date 类型,地理位置字段必须是 geo_point 类型 - 不支持其他类型的距离计算 ### 评分机制 - 距离越近,得分越高 - 使用 boost 参数调整权重 - 可以与其他查询组合使用 ### 性能考虑 - 地理距离计算较为耗费资源,建议使用合适的索引优化地理查询,比如:考虑使用地理网格索引提升性能 ## Pinned 查询 ### 功能说明 实现对某些文档的**置顶**功能,使用存储在\_id 字段中的文档 ID 来标识升级或“固定”的文档。 此功能通常用于引导搜索者查找精选的文档,这些文档在搜索的任何 “organic” 匹配项之上被提升。**当查询中有排序时,pinned 查询失效**。 #### 使用限制 - 不能与自定义排序一起使用 - 置顶文档必须存在于索引中 - 最多支持 100 个置顶文档 #### 排序规则 - 置顶文档按照 ids 数组中的顺序排序 - organic 查询结果按照相关性得分排序 - 置顶文档始终在 organic 结果之前 ## PIT 查询 ### 功能说明 Point in time 查询是一个**轻量级的视图**,根据保留周期保留 PIT 查询发生时数据的状态,用于不同条件的深度分页查询。 scroll 滚动搜索及其上下文与查询内容绑定。这意味着编写一个查询,添加一个滚动参数,来自这个查询的响应数据就会保持一致。不同的查询内容则会产生不同的 scroll 上下文,资源使用就会相对紧张。有时想**对同一固定数据集适时运行不同的查询**,就需要 PIT 查询。 如果对于一个不断变化的索引有着很高的搜索负载,那么为每个请求创建一个新的时间点查询会使用相当多的资源。可以通过使用一个后台进程每隔几分钟创建一个时间点 id 并将其用于所有搜索请求的方式来优化资源使用 更多内容可以[参照这里](https://blog.csdn.net/UbuntuTouch/article/details/119925187) ### 注意事项 #### 资源管理 - **PIT 会占用系统资源,需要及时释放** - 建议设置合理的保留时间 - 监控 open context 数量 #### 使用场景 - 适合需要一致性视图的场景 - 适合需要深度分页的场景 - 适合需要在固定数据集上执行多次查询的场景 #### 性能优化 - 避免过长的保留时间,合理设置批次大小 - 建议查询的时候带 sort 参数排序 ## 测试代码 ``` // 1. 使用 product_test 索引,创建 PIT POST /product_test/_pit?keep_alive=1m ``` {{% load-img "/img/blog/2025/feature-evolution-from-elasticsearch-6.8-to-7.10-part-3/ES6-7-3.1.png" "" %}} ``` GET /_search { "size": 1, "query": { "match": { "model": "iphone" } }, "pit": { "id": "i6-xAwEMcHJvZHVjdF90ZXN0FmRObXltV3ZDU1VTTnllYjNoR0ZtamcAFk1GQklTWXBaUkllb2h1cGl1VVFsdUEAAAAAAAABZk8WOFVoUHBhN3BSVVN5TWVmeTh4d3JpdwEWZE5teW1XdkNTVVNOeWViM2hHRm1qZwAA", "keep_alive": "1m" }, "sort": [ {"_score": "desc"}, {"_id": "asc"} ] } ``` {{% load-img "/img/blog/2025/feature-evolution-from-elasticsearch-6.8-to-7.10-part-3/ES6-7-3.2.png" "" %}} ``` DELETE /_pit {"id":"i6-xAwEMcHJvZHVjdF90ZXN0FmRObXltV3ZDU1VTTnllYjNoR0ZtamcAFk1GQklTWXBaUkllb2h1cGl1VVFsdUEAAAAAAAABZk8WOFVoUHBhN3BSVVN5TWVmeTh4d3JpdwEWZE5teW1XdkNTVVNOeWViM2hHRm1qZwAA"} ``` {{% load-img "/img/blog/2025/feature-evolution-from-elasticsearch-6.8-to-7.10-part-3/ES6-7-3.3.png" "" %}} ## 小结 作为查询方法,Elasticsearch 新增的几个功能面对的场景更加具象且方便,大家可以根据业务的场景特性可以优化使用。其中深度分页查询是 ES 使用者几乎避免不了的场景,PIT 查询也是提供了一个更为优质的方法。