微服务框架

【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 自定义分词器相关推荐

  1. 微服务框架 SpringCloud微服务架构 25 黑马旅游案例 25.5 排序和搜索关键字高亮

    微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] SpringCloud微服务 ...

  2. 微服务框架 SpringCloud微服务架构 25 黑马旅游案例 25.4 广告置顶

    微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] SpringCloud微服务 ...

  3. 微服务框架 SpringCloud微服务架构 26 数据聚合 26.5 多条件聚合

    微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] SpringCloud微服务 ...

  4. 微服务框架 SpringCloud微服务架构 服务异步通讯 51 死信交换机 51.3 延迟队列 51.3.1 延迟队列 51.3.2 延迟队列插件

    微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] 服务异步通讯 文章目录 微服 ...

  5. 微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.2 实现XA 模式

    微服务框架 [SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务] 分布式事务 文章目录 微服务 ...

  6. 最新微服务框架SpringCloud Alibaba介绍,搭建

    微服务和SpringCloud Alibaba详细介绍(一),手把手搭建微服务框架 PS:本博客是本人参照B站博主:JAVA阿伟如是说 的视频讲解手敲整理的笔记 跟着一起手动搭建的框架 供大家一起学习 ...

  7. 微服务框架springcloud(实用篇)【5】Elasticsearch 01

    一.初识elasticsearch 1.了解ES 1)elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要 ...

  8. 华为18级大牛倾情奉送:分布式服务框架和微服务设计原理实战文档,啃完发现涨薪如此简单

    前言 分布式服务框架不仅仅包含核心的运行时类库,还包括服务划分原则.服务化最佳实践.服务治理.服务监控.服务开发框架等,它是一套完整的解决方案,用来协助应用做服务化改造,以及指导用户如何构建适合自己业 ...

  9. SpringCloud(9)— Elasticsearch聚合和自动补全

    SpringCloud(9)- Elasticsearch聚合和自动补全 一 数据聚合 1.聚合的分类 聚合(aggregations)可以实现对文档数据的统计,分析,运算.常见的聚合有三种: 1.桶 ...

最新文章

  1. sql删除过程的命令是什么_一个删除表字段的自动化执行工单的思考
  2. 【收藏】Kubernetes学习之路(二十二)之Pod资源调度
  3. python获取当前线程名称_python使用标准库根据进程名如何获取进程的pid详解
  4. mmseg java_MMSeg中文分词算法
  5. JavaScript+ Canvas开发趣味小游戏《贪吃蛇》
  6. 建模股票价格数据并进行预测(统计信号模型):随机信号AR模型+Yule-Walker方程_Python...
  7. [python] 字典和列表中的pop()函数
  8. 电脑telnet工具如何开启
  9. 2022年北京购房攻略一 (常识篇)
  10. bootstrap案例
  11. Elasticsearch语法大全
  12. net c# 代码连接数据库
  13. 垃圾小白羊leetcode刷题记录2
  14. CENTOS6 安装配置 pptpd 心得
  15. 计算机专业老师考什么教师,老师!计算机专业的考试也太太太太太太难了!
  16. 机械电气自动化常用知识手册
  17. 《极光征文》颁奖 | 恭喜你完成 2019 第一个小目标
  18. python提取身份证信息_Python selenium 身份证信息在线解析爬取
  19. 这次把怎么做好一个PPT讲清-演讲篇
  20. 4.16 使用可选颜色命令调整图像色彩 [原创Ps教程]

热门文章

  1. 等待事件buffer busy waits
  2. 人和计算机比赛下棋结果,人机大战趣谈:会下棋的电脑 像人一样聪明
  3. c语言单片机停车场收费系统,基于51单片机停车场车位引导系统设计
  4. Hadoop 大数据概念那些事儿
  5. c#实现qq音乐爬虫
  6. 【GAT】如何理解Graph Attention Network(注意力机制)?
  7. 李航老师《统计学习方法》第二版第二章答案
  8. 【报告分享】2021小红书食饮品牌研究报告-艺恩(附下载)
  9. 2014婚纱照8大流行风格大揭密
  10. 手电筒安卓_iPhone手电筒只能照明?这两个隐藏技巧一定要会,事半功倍!