
Elasticsearch 8.X 有哪些自动补全的检索方式?
1、自动补全或前缀匹配检索实现效果图
Elasticsearch 能实现自动补全检索的方案很多,可以简单归结为如下几种不同的方案:
- 方案一:
Prefix
前缀匹配检索。 - 方案二:
MatchPhrase prefix
短语前缀匹配检索。 - 方案三:更细粒度的
ngram
分词间接解决前缀匹配检索。 - 方案四:
Search as your type
类型。 - 方案五:
Completion Suggest
自动补全。
方案一、方案二的样例数据如下所示:
2、prefix前缀匹配
2.1 prefix 检索类型范畴
属于 term level 精准匹配的范畴。
2.2 针对字段类型:
- keyword类型。
- 当然 text 也可以,但不够精准,结果可能达不到预期。
检索召回数据结果如下(仅截图最核心部分):
3、 match_prhase_prefix 检索类型
3.1 检索类型范畴
属于全文检索的范畴。
3.2 针对字段类型
- text 类型。
- 确切说,是实现 text 短语匹配的自动补全功能。
3.3 match_phrase_prefix 短语前缀匹配演示
检索召回数据结果如下(仅截图最核心部分):
3.4 match_phrase_prefix 检索核心实现
实则为:MultiPhraseQuery 实现“世界”、“世”、“界”的组合检索。
有同学可能会问:“世界 世 界” 三个分词单元怎么来的?
看这里,和 analyzer 分词有关系,我们的字段 title 设置的是 text 类型,选择的分词器:ik_max_word 分词器。
4、更细粒度分词器解决自动补全检索
之前咱们讲过,也是大家常见的问题,比如:手机号的自动补全检索问题。
这种传统的分词和咱们上面讲过的两种检索方式都不灵。怎么办?
需要自定义分词来实现。
4.1 自定义分词实现
如上 analyze 分词结果为:
导入数据
执行检索
- 自定义分词实现自动补全检索的优点:空间换时间,针对极大数据量检索依然会很快。
- 缺点:1、写入效率低;2、磁盘空间耗费大。
5、search_as_your_type 检索方案
5.1 search_as_your_type 数据类型介绍
search_as_your_type
字段类型(7.2 版本之后才有的功能)是一个类似文本的字段,经过优化以提供开箱即用的支持,用于完成自动补全的查询。
支持前缀完成(即匹配从输入开头开始的术语)和中缀完成(即匹配输入中任何位置的术语)的检索。
5.2 search_as_your_type 初探
search_as_your_type 字段本质上支持四种不同的分词。
- 第一种:标准 standard 分词器,单字为一个分词单元;
- 第二种:_2gram 分词器,两个单词为一个分词单元;
- 第三种:_3gram 分词器,三个单词为一个分词单元;
- 第四种:_index_prefix 分词器,前缀、中缀分词方式。
以“世界杯的微博”文档为例,各种不同类型的分词结果如下:
5.3 search_as_your_type 实战
如下检索方式使用了:multi_match 和 bool_prefix 检索结合"title"、“title._2gram”、"title._3gram"、“title._index_prefix”多字段检索的方式。
这几个字段的最终检索结果基于 most_fields 方式求和得到总的评分。
实际业务层面根据需要选择字段即可。
对比可以看出,这种检索方式非常的灵活。
6、自动补全建议 suggesters 检索
6.1 Elasticsearch suggesters 介绍
Suggesters
是 Elasticsearch 中的高级解决方案,可根据用户的输入的文本返回外观相似的短语。Suggesters
可以实现类似:检索时提示、用户搜索词联想或校验等功能。
相比于前四种实现方式,这种方式“根正苗红”,更加的适合实现企业级的自动补全检索。
6.2 Elasticsearch completion suggest 用法
创建索引及构造数据如下:
- 首先,需要在索引中添加一个 suggest 字段。如下代码的 suggest 字段,该字段将保存要提供的补全建议。
- 然后,写入数据。同时指定input 文本和 weight 权重。input 代表补全建议的文本信息;weight 代表权重,权值越大,计算的评分越高;反之,则相反。
- 最后,使用 Elasticsearch 的自动补全 API 来获取补全建议。
我们推荐结果有重复数据,如何去重呢?
这个问题业务层面也经常遇到。completion 借助参数:
实现推荐结果数据的去重。
7、小结
关于Elasticsearch 8.X 能实现自动补全,本文提供了五种不同的方案。几种方案的对比概括如下:
解决企业级业务问题,远不止这几种方案。
你有没有遇到自动补全问题,用什么方案解决的?
欢迎留言讨论。
文章转载自公众号:铭毅天下Elasticsearch
