Elasticsearch 系列
内容 链接 Elasticsearch 基础操作 https://blog.yexca.net/archives/226 Elasticsearch 查询操作 https://blog.yexca.net/archives/227 RestClient 基础操作 https://blog.yexca.net/archives/228 RestClient 查询操作 https://blog.yexca.net/archives/229 Elasticsearch 数据聚合 https://blog.yexca.net/archives/231 Elasticsearch 自动补全 本文 Elasticsearch 数据同步 https://blog.yexca.net/archives/234 Elasticsearch 集群 https://blog.yexca.net/archives/235
当用户在搜索框输入字符时,应提示与该字符有关的搜索项,根据输入的字母提供完整词条功能,就是自动补全
拼音分词
要实现根据字母做补全,就必须对文档按照拼音分词
项目地址: https://github.com/medcl/elasticsearch-analysis-pinyin
安装方式同 IK 分词器,以下为在线安装方式,首先进入容器
|
|
执行命令
|
|
然后退出重启
|
|
测试
|
|
自定义分词器
默认的拼音分词器会将每个汉字单独分为拼音,而我们希望的是每个词条形成一组拼音,需要对拼音分词器做个性化定制,形成自定义分词器
es 中分词器 (analyzer) 的组成分为三部分:
- character filters:在 tokenizer 之前对文本进行处理。例如删除字符、替换字符
- tokenizer:将文本按照一定的规则切割成词条 (term)。例如 keyword,就是不分词;还有 ik_smart
- tokenizer filter:将 tokenizer 输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等
声明自定义分词器的语法如下
|
|
测试
|
|
自动补全查询
es 提供了 Completion Suggester 查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询的效率,对于文档中字段的类型有一些约束:
- 参与补全查询的字段必须是 completion 类型
- 字段的内容一般是用来补全的多个词条形成的数组
创建测试索引库
|
|
插入测试数据
|
|
查询
|
|
自动补全 Java
上述 DSL 的 Java 请求
|
|
响应处理:
|
|
酒店搜索自动补全
之前的 hotel 索引库没设置拼音分词器,但索引库无法修改,所以需要删除重建
|
|
修改 HotelDoc 实体类,添加 suggestion 字段
|
|
重新导入数据
|
|
查询测试
|
|
可以看到查询结果 suggestion 字段,然后编写业务代码
Controller
|
|
Service
|
|