微服务框架 SpringCloud微服务架构 27 自动补全 27.2 自定义分词器
微服务框架
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
SpringCloud微服务架构
文章目录
- 微服务框架
- SpringCloud微服务架构
- 27 自动补全
- 27.2 自定义分词器
- 27.2.1 自定义分词器
- 27.2.2 总结
27 自动补全
27.2 自定义分词器
27.2.1 自定义分词器
首先看看之前的拼音分词存在的问题
- rjjdhbc:是这整句话的每个词的拼音首字母,并没有进行分词
- 而且它是把
如家酒店还不错
这句话中的每个字,都形成了一个单独的拼音 - 而且这次分词,没有汉字,只剩下了拼音【汉字也想保留】
elasticsearch中分词器(analyzer)的组成包含三部分:
- character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符
- tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smart
- tokenizer filter:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等
举个栗子,一次自定义分词器的工作流程
这样就达到了我们自己想要的效果
【如何实现?】
我们可以在创建索引库时,通过settings来配置自定义的analyzer(分词器):
PUT /test
{"settings": {"analysis": {"analyzer": { // 自定义分词器"my_analyzer": { // 分词器名称"tokenizer": "ik_max_word","filter": "pinyin"}}}}
}
这样就解决了分词的问题
但是现在并没有完全解决我们的三个问题,比如现在的拼音分词器,就算是对分词,它还是会把每个拼音拆成字儿,然后全拼,这显然不是我们想要的
看看官网文档
https://github.com/medcl/elasticsearch-analysis-pinyin
这些参数就可以控制拼音分词器的效果
PUT /test
{"settings": {"analysis": {"analyzer": { // 自定义分词器"my_analyzer": { // 分词器名称"tokenizer": "ik_max_word","filter": "py"}},"filter": { // 自定义tokenizer filter"py": { // 过滤器名称"type": "pinyin", // 过滤器类型,这里是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}}}}
}
直接试试
# 自定义分词器
PUT /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"}}}
}
直接运行
OK, 索引库test 创建成功
测试这个自定义的分词器
POST /test/_analyze
{"text": ["如家酒店还不错"],"analyzer": "my_analyzer"
}
直接运行,结果
OK, 结果
{"tokens" : [{"token" : "如家","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "rujia","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "rj","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "酒店","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 1},{"token" : "jiudian","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 1},{"token" : "jd","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 1},{"token" : "还不","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 2},{"token" : "haibu","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 2},{"token" : "hb","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 2},{"token" : "不错","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 3},{"token" : "bucuo","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 3},{"token" : "bc","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 3}]
}
OK, 挺好
插入一些文档
POST /test/_doc/1
{"id": 1,"name": "狮子"
}
POST /test/_doc/2
{"id": 2,"name": "虱子"
}
运行
OK,两个 shizi 插入成功
搜索一下,搜shizi
GET /test/_search
{"query": {"match": {"name": "shizi"}}
}
运行结果
效果很明显,两个“shizi” 都查出来了
再试一个
GET /test/_search
{"query": {"match": {"name": "掉入狮子笼咋办"}}
}
运行结果
可以看到虱子还是出来了,这说明什么
我们的自定义分词器还有点问题【把同音词也搜出来了】
【原因】
拼音分词器适合在创建倒排索引的时候使用,但不能在搜索的时候使用。
创建倒排索引时:
搜索时,用户搜索“狮子”:
这就是因为在搜索时也用了拼音分词器,中文的狮子分出了一个“shizi” ,拿这个“shizi” 去索引库中找的时候,当然就会找到虱子
【这显然不是我们希望看到的】
就是说,创建倒排索引时使用拼音分词器,没问题,但是在搜索的时候,就不应该了
想要的效果:用户输入的中文,就拿中文去搜,用户输入的拼音,才拿拼音去搜
【如何实现】
因此字段在创建倒排索引时应该用my_analyzer分词器;字段在搜索时应该使用ik_smart分词器;
PUT /test
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "ik_max_word", "filter": "py"}},"filter": {"py": { ... }}}},"mappings": {"properties": {"name": {"type": "text","analyzer": "my_analyzer","search_analyzer": "ik_smart"}}}
}
试试
先把当前这个索引库删掉
OK,新来一个索引库
# 自定义分词器
PUT /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"}}}
}
直接运行
OK, 再把那两个shizi 插进入
OK
再次测试
这次就只搜到一个了,换成shizi 拼音
没毛病
27.2.2 总结
如何使用拼音分词器?
①下载pinyin分词器
②解压并放到elasticsearch的plugin目录
③重启即可
如何自定义分词器?
①创建索引库时,在settings中配置,可以包含三部分
②character filter
③tokenizer
④filter
拼音分词器注意事项?
- 为了避免搜索到同音字,搜索时不要使用拼音分词器
微服务框架 SpringCloud微服务架构 27 自动补全 27.2 自定义分词器相关推荐
- 微服务框架 SpringCloud微服务架构 25 黑马旅游案例 25.5 排序和搜索关键字高亮
微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] SpringCloud微服务 ...
- 微服务框架 SpringCloud微服务架构 25 黑马旅游案例 25.4 广告置顶
微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] SpringCloud微服务 ...
- 微服务框架 SpringCloud微服务架构 26 数据聚合 26.5 多条件聚合
微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] SpringCloud微服务 ...
- 微服务框架 SpringCloud微服务架构 服务异步通讯 51 死信交换机 51.3 延迟队列 51.3.1 延迟队列 51.3.2 延迟队列插件
微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] 服务异步通讯 文章目录 微服 ...
- 微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.2 实现XA 模式
微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] 分布式事务 文章目录 微服务 ...
- 最新微服务框架SpringCloud Alibaba介绍,搭建
微服务和SpringCloud Alibaba详细介绍(一),手把手搭建微服务框架 PS:本博客是本人参照B站博主:JAVA阿伟如是说 的视频讲解手敲整理的笔记 跟着一起手动搭建的框架 供大家一起学习 ...
- 微服务框架springcloud(实用篇)【5】Elasticsearch 01
一.初识elasticsearch 1.了解ES 1)elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要 ...
- 华为18级大牛倾情奉送:分布式服务框架和微服务设计原理实战文档,啃完发现涨薪如此简单
前言 分布式服务框架不仅仅包含核心的运行时类库,还包括服务划分原则.服务化最佳实践.服务治理.服务监控.服务开发框架等,它是一套完整的解决方案,用来协助应用做服务化改造,以及指导用户如何构建适合自己业 ...
- SpringCloud(9)— Elasticsearch聚合和自动补全
SpringCloud(9)- Elasticsearch聚合和自动补全 一 数据聚合 1.聚合的分类 聚合(aggregations)可以实现对文档数据的统计,分析,运算.常见的聚合有三种: 1.桶 ...
最新文章
- sql删除过程的命令是什么_一个删除表字段的自动化执行工单的思考
- 【收藏】Kubernetes学习之路(二十二)之Pod资源调度
- python获取当前线程名称_python使用标准库根据进程名如何获取进程的pid详解
- mmseg java_MMSeg中文分词算法
- JavaScript+ Canvas开发趣味小游戏《贪吃蛇》
- 建模股票价格数据并进行预测(统计信号模型):随机信号AR模型+Yule-Walker方程_Python...
- [python] 字典和列表中的pop()函数
- 电脑telnet工具如何开启
- 2022年北京购房攻略一 (常识篇)
- bootstrap案例
- Elasticsearch语法大全
- net c# 代码连接数据库
- 垃圾小白羊leetcode刷题记录2
- CENTOS6 安装配置 pptpd 心得
- 计算机专业老师考什么教师,老师!计算机专业的考试也太太太太太太难了!
- 机械电气自动化常用知识手册
- 《极光征文》颁奖 | 恭喜你完成 2019 第一个小目标
- python提取身份证信息_Python selenium 身份证信息在线解析爬取
- 这次把怎么做好一个PPT讲清-演讲篇
- 4.16 使用可选颜色命令调整图像色彩 [原创Ps教程]