上一篇咱们了解了 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 并将其用于所有搜索请求的方式来优化资源使用
更多内容可以参照这里
注意事项
资源管理
- PIT 会占用系统资源,需要及时释放
- 建议设置合理的保留时间
- 监控 open context 数量
使用场景
- 适合需要一致性视图的场景
- 适合需要深度分页的场景
- 适合需要在固定数据集上执行多次查询的场景
性能优化
- 避免过长的保留时间,合理设置批次大小
- 建议查询的时候带 sort 参数排序
测试代码
// 1. 使用 product_test 索引,创建 PIT
POST /product_test/_pit?keep_alive=1m
GET /_search
{
"size": 1,
"query": {
"match": {
"model": "iphone"
}
},
"pit": {
"id": "i6-xAwEMcHJvZHVjdF90ZXN0FmRObXltV3ZDU1VTTnllYjNoR0ZtamcAFk1GQklTWXBaUkllb2h1cGl1VVFsdUEAAAAAAAABZk8WOFVoUHBhN3BSVVN5TWVmeTh4d3JpdwEWZE5teW1XdkNTVVNOeWViM2hHRm1qZwAA",
"keep_alive": "1m"
},
"sort": [
{"_score": "desc"},
{"_id": "asc"}
]
}
DELETE /_pit
{"id":"i6-xAwEMcHJvZHVjdF90ZXN0FmRObXltV3ZDU1VTTnllYjNoR0ZtamcAFk1GQklTWXBaUkllb2h1cGl1VVFsdUEAAAAAAAABZk8WOFVoUHBhN3BSVVN5TWVmeTh4d3JpdwEWZE5teW1XdkNTVVNOeWViM2hHRm1qZwAA"}
小结
作为查询方法,Elasticsearch 新增的几个功能面对的场景更加具象且方便,大家可以根据业务的场景特性可以优化使用。其中深度分页查询是 ES 使用者几乎避免不了的场景,PIT 查询也是提供了一个更为优质的方法。
推荐阅读
- 谈谈 ES 6.8 到 7.10 的功能变迁(1)- 性能优化篇
- 谈谈 ES 6.8 到 7.10 的功能变迁(2)- 字段类型篇
- 谈谈 ES 6.8 到 7.10 的功能变迁(4)- 聚合功能篇
- 谈谈 ES 6.8 到 7.10 的功能变迁(5)- 任务和集群管理
- 谈谈 ES 6.8 到 7.10 的功能变迁(6)- 其他