ElasticSearch从入门到精通--第七话(自动补全、拼音分词器、自定义分词、数据同步方案)
ElasticSearch从入门到精通–第七话(自动补全、拼音分词器、自定义分词、数据同步方案)
使用拼音分词
可以引入elasticsearch的拼音分词插件,地址:https://github.com/medcl/elasticsearch-analysis-pinyin
下载后,将包上传至服务器后,解压缩
unzip -d py elasticsearch-analysis-pinyin-7.12.1.zip
将压缩后的目录放入
es的plugins中即可
,我这边是docker的数据卷,直接放入就行cp -r py/ /var/lib/docker/volumes/es-plugins/_data
重启es服务
docker restart es
进入kibana控制台,使用拼音分词器看下结果
POST
请求/analyze
{"analyzer": "pinyin","text": "学习es的很多天"
}
是按照拼音进行分词的。
自定义分词器
实现方式就是先走ik分词器
,然后再走pinyin分词器
进行拼音处理。
我们可以在创建索引库时,通过settings来配置自定义的analyzer
(分词器)
实例:
PUT /test
{"settings": {"analysis": {"analyzer": { "my_analyzer": { // 自定义 my_analyzer分词器"tokenizer": "ik_max_word", // 先经过ik处理"filter": "py" // 在经过拼音处理}},"filter": {"py": { "type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"name":{"type": "text","analyzer": "my_analyzer" // 使用自定义分词器}}}
}
测试
POST /test/_analyze
{"analyzer": "my_analyzer","text": "学习es的很多天"
}
中英文的分词都具有了。
完整版索引创建+分词器
但是拼音分词器适合在创建倒排索引的时候使用,不能在搜索的时候使用。假如遇见同音不同字的,搜索时是按照中文搜索的,那么所有同音的就会全都被搜索出来,会出问题。!
如下:在文档中新增狮子、虱子
后,查询时中文带狮子
,但是因为查询时也同时使用了拼音分词器,所以虱子也会被查询
所以,我们可以在创建索引时使用ik
和pinyin
分词器,但是查询时还是要根据用户输入的是中文还是拼音去选择分词器。
DELETE /testPUT /test
{"settings": {"analysis": {"analyzer": { "my_analyzer": { "tokenizer": "ik_max_word","filter": "py"}},"filter": {"py": { "type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"name":{"type": "text","analyzer": "my_analyzer","search_analyzer": "ik_smart" // 查询时使用ik分词器}}}
}
自动补全
es提供了Completion Suggester查询来实现自动补全功能。这个查询会匹配用户输入内容开头的词条并且返回。条件是:参与补全查询的字段必须设置为completion类型,字段的内容一般是用来补全的多个词条形成的数组
查询时不再用query,而是使用的suggest
示例:
DELETE test
PUT test
{"mappings": {"properties": {"title":{"type": "completion"}}}
}// 插入数据
POST test/_doc
{"title": ["Sony", "WH-1000XM3"]
}
POST test/_doc
{"title": ["SK-II", "PITERA"]
}
POST test/_doc
{"title": ["Nintendo", "switch"]
}
查询
GET /test/_search
{"suggest": {"title_suggest": { // 自定义查询名"prefix": "s", // 关键字,这里有写text的,也有写prefix的,效果类似"completion": {"field": "title", // 补全字段"skip_duplicates": true, // 跳过重复的"size": 10 // 获取前10条结果}}}
}
完整版demo
PUT /hotel
{"settings": {"analysis": {"analyzer": {"text_anlyzer": {"tokenizer": "ik_max_word","filter": "py"},"completion_analyzer": {"tokenizer": "keyword","filter": "py"}},"filter": {"py": {"type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"id":{"type": "keyword"},"name":{"type": "text","analyzer": "text_anlyzer","search_analyzer": "ik_smart","copy_to": "all"},"address":{"type": "keyword","index": false},"price":{"type": "integer"},"score":{"type": "integer"},"brand":{"type": "keyword","copy_to": "all"},"city":{"type": "keyword"},"starName":{"type": "keyword"},"business":{"type": "keyword","copy_to": "all"},"location":{"type": "geo_point"},"pic":{"type": "keyword","index": false},"all":{"type": "text","analyzer": "text_anlyzer","search_analyzer": "ik_smart"},"suggestion":{"type": "completion","analyzer": "completion_analyzer"}}}
}
RestAPI实现自动补全+结果处理
public class ESTEST_API_Query {public static void main(String[] args) throws IOException {// 创建es客户端,指定ip和端口RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.1.40", 9200, "http")));SearchRequest request = new SearchRequest("hotel");request.source().suggest(new SuggestBuilder().addSuggestion("mySuggestion",SuggestBuilders.completionSuggestion("title").prefix("h") // 用户输入的关键字.skipDuplicates(true) // 跳过重复.size(10) // 取10条));SearchResponse response = client.search(request, RequestOptions.DEFAULT);client.close();}
}
结果处理
数据同步
es中很多数据都是来自mysql的,因为mysql数据发生改变时,es必须要跟着改变数据,就是es和mysql之间的数据同步
.
实现简单,粗暴。但是业务耦合度较高。
低耦合,实现难度一般,需要依赖mq的可靠性
ElasticSearch从入门到精通--第七话(自动补全、拼音分词器、自定义分词、数据同步方案)相关推荐
- [ElasticSearch]Suggest查询建议(自动补全纠错)
1) 概念 查询建议,能够为用户提供良好的使用体验.主要包括: 拼写检查(纠错) 自动建议查询词(自动补全) 2) Suggest种类及参数 2.1 Term Suggester Te ...
- Elasticsearch 分布式搜索引擎 -- 自动补全(拼音分词器、自定义分词器、自动补全查询、实现搜索框自动补全)
文章目录 1. 自动补全 1.1 拼音分词器 1.2.1 自定义分词器 1.2.2 小结 1.2 自动补全 1.3 实现酒店搜索框自动补全 1.3.1 修改酒店映射结构 1.3.2 修改HotelDo ...
- SpringCloud(9)— Elasticsearch聚合和自动补全
SpringCloud(9)- Elasticsearch聚合和自动补全 一 数据聚合 1.聚合的分类 聚合(aggregations)可以实现对文档数据的统计,分析,运算.常见的聚合有三种: 1.桶 ...
- Elasticsearch高级使用-自动补全
一.概念 注意事项 为了避免搜索同音字,搜索时不要使用拼音分词器 二.拼音分词器 官网https://github.com/medcl/elasticsearch-analysis-pinyin 安装 ...
- Elasticsearch生产实战(ik分词器、拼音分词、自动补全、自动纠错)
目录 一.IK分词器 1.IK分词器介绍 2.安装 3.使用 4.自定义词库 二.拼音分词器 1.拼音分词器介绍 2.安装 三.自动补全 1.效果演示 2.实战 四.自动纠错 1.场景描述 2.DSL ...
- ElasticSearch第一讲:ElasticSearch从入门到精通
ElasticSearch第一讲:ElasticSearch从入门到精通 业内目前来说事实上的一个标准,就是分布式搜索引擎一般大家都用elasticsearch.本文是ElasticSearch第一讲 ...
- wlan从入门到精通第七期直接转发和隧道转发
wlan从入门到精通第七期直接转发和隧道转发 AC+FIT AP架构的网络中存在两种报文,一类是AC管理控制AP的报文,称为管理报文(也叫控制报文),另一类是STA的用户数据报文,称为业务报文. 如上 ...
- Elasticsearch从入门到精通 理论 集群 优化 框架集成
Elasticsearch 入门 Elasticsearch 安装 下载软件 Elasticsearch 的官方地址:https://www.elastic.co/cn/ Elasticsearch ...
- Elasticsearch实战-实现Hotel索引库的自动补全、拼音搜索功能
一.实现思路 1.修改hotel索引库结构,设置自定义拼音分词器 2.修改索引库的name.all字段,使用自定义分词器 3.索引库添加一个新字段suggestion,类型为completion类型, ...
最新文章
- CSS之定位(绝对定位元素的布局)
- 基于OpenCV提取特定区域
- Spring MVC中用@ResponseBody转json,对json进行处理方法汇总
- 【深度学习】基于Pytorch多层感知机的高级API实现和注意力机制(二)
- 自考计算机及应用笔记,自考“计算机及应用”专业论文参考范文
- 【Tree】Prim算法思想与步骤
- Android--加载大分辨率图片到内存
- lua C++ wrapper
- linux防火墙配置说明,Linux防火墙配置命令参数说明
- 在计算机发展的早期 计算机主要用于,全国网络统考《计算机应用基础》选择题复习...
- latex正文显示运算符
- 免费送书的网站-每人限一本
- realtime multi-person 2D pose estimation using part affinity fields
- elasticsearch如何使用?
- Hbase ConnectionFactory
- 数塔问题-------给你有哪些启示?
- 动态物体检测(python)
- linux 延迟 10 ms,网络延迟10ms怎么做到(增加网络延迟软件)
- 灵雀云ACP成功通过金融信创生态实验室适配验证
- @TOM VIP邮箱,打造商务办公新场景,定位职场人的贴心助手!
热门文章
- 威联通nas怎么更换大硬盘_更换NAS后,数据如何安全处理?聊聊NAS数据安全性那些事...
- 苹果应用中含有第三方支付怎么办?
- 项目管理之项目集管理
- 中国幽门螺杆菌感染研究进展
- 数据库连接异常: HikariPool-1 - Connection is not available, request timed out after 30000ms.
- 九针串口接线问题, 232, 485
- 民俗杂事丨“大力丸”是壮阳药吗?
- EC MCAD Connector 3010 AdminGuide-2
- 获取服务器微信头像更改不同规格图片大小
- 简陋无匹的python学生信息管理系统