一、概念


注意事项

为了避免搜索同音字,搜索时不要使用拼音分词器

二、拼音分词器

官网https://github.com/medcl/elasticsearch-analysis-pinyin

安装

注意与elasticsearch的对应关系

下载

我们的ES使用了7.15.1,所以我们使用master分支代码。打开官网,下载master分支的zip代码
https://codeload.github.com/medcl/elasticsearch-analysis-pinyin/zip/refs/heads/master

解压

unzip elasticsearch-analysis-pinyin-master.zip

编译

主要修改pom.xml中ES的版本号,需要对应你安装的es的版本

<properties><elasticsearch.version>7.15.1</elasticsearch.version>...
</properties>
  • 方法一 直接mvn package
    注意jdk要1.8以上,打开cmd,cd到解压后的文件夹目录
mvn package
  • 方法二 在idea中编译

打包好了过后,当前目录多了一个target文件夹,点击进入就会在releases下面生成zip安装包

配置ES

在releases文件夹下面,解压zip包

unzip elasticsearch-analysis-pinyin-7.15.1.zip
# 重命名文件py
mv elasticsearch-analysis-pinyin-7.15.1.zip py


将文件移动到ES的plugins目录
因为我的es是docker安装,所以目录是:/usr/local/elasticsearch/plugins

重启ES

docker restart elasticsearch

查看启动日志

切记分词器的版本号一定要与ES的安装版本号一一致

体验效果

# 测试拼音分词器
POST /_analyze
{"text": ["如家酒店还不错"],"analyzer": "pinyin"
}

三、自定义分词器

使用了拼音分词器之后,导致汉字分词没有了,大部分场景还是需要汉字分词,包括内容有表情符号的。所以需要自定义分词器;

概念

如何创建自定义分词器

  • 创建索引库时,在settings中配置,可以包含三部分
  • character filter
  • tokenizer
  • filter

在创建索引库时,通过settings来配置自定义的analyzer(分词器)

filter中属性可以参照官网

创建自定义分词器

# 自定义分词器
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"}}}
}

测试

# 测试自定义分词器
POST /test/_analyze
{"text": ["如家酒店还不错"],"analyzer": "my_analyzer"
}

测试demo

准备数据

# 插入测试文档
POST /test/_doc/1
{"id":1,"name":"狮子"
}POST /test/_doc/2
{"id":2,"name":"虱子"
}

测试搜索

GET /test/_search
{"query":{"match": {"name": "shizi"}}
}

问题思考,当我们搜索狮子时,虱子也被搜出,为了避免搜索同音字,搜索时不要使用拼音分词器

原因如下:

解决办法

在创建倒排索引时应该用my_analyzer分词器;字段在搜索时应该使用ik_smart分词器

先删除索引,在创建

# 先删除
DELETE /test
# 自定义分词器
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"}}}
}

然后重新插入之前的1,2文档
再次搜索如下

四、自动补全查询

对字段的要求

  • 类型是completion类型
  • 字段值是多词条的数组

completion suggester查询


示例

# 自动补全的索引库
PUT test2
{"mappings": {"properties": {"title":{"type": "completion"}}}
}# 示例数据
# 插入测试文档
POST /test2/_doc
{"title":["Sony","WH-1000XM3"]
}POST /test2/_doc
{"title":["SK-II","PITERA"]
}POST /test2/_doc
{"title":["Nintendo","switch"]
}# 自动补全查询
GET /test2/_search
{"suggest": {"titleSuggest": {"text": "s","completion": {"field": "title","skip_duplicates":true,"size":10}}}
}

效果

Elasticsearch高级使用-自动补全相关推荐

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

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

  2. ES系列、Elasticsearch Suggester API(自动补全)

    1.概念 1.1 补全api主要分为四类 Term Suggester(纠错补全,输入错误的情况下补全正确的单词) Phrase Suggester(自动补全短语,输入一个单词补全整个短语) Comp ...

  3. Elasticsearch 分布式搜索引擎 -- 自动补全(拼音分词器、自定义分词器、自动补全查询、实现搜索框自动补全)

    文章目录 1. 自动补全 1.1 拼音分词器 1.2.1 自定义分词器 1.2.2 小结 1.2 自动补全 1.3 实现酒店搜索框自动补全 1.3.1 修改酒店映射结构 1.3.2 修改HotelDo ...

  4. Elasticsearch实战-实现Hotel索引库的自动补全、拼音搜索功能

    一.实现思路 1.修改hotel索引库结构,设置自定义拼音分词器 2.修改索引库的name.all字段,使用自定义分词器 3.索引库添加一个新字段suggestion,类型为completion类型, ...

  5. ElasticSearch高级篇(数据聚和、自动补全、数据同步、分片集群)

    文章目录 1.数据聚合 1.1.聚合的种类 1.2.DSL实现聚合 1.2.1.Bucket聚合语法 1.2.2.聚合结果排序 1.2.3.限定聚合范围 1.2.4.Metric聚合语法 1.2.5. ...

  6. elasticsearch搜素关键字自动补全(suggest)

    elasticsearch搜素关键字自动补全顾名思义 在搜索框搜索时能有提示列表可供选择. 最终效果如下: 该搜索优化功能是elasticsearch自带的即suggest,suggest即存储一个词 ...

  7. ElasticSearch从入门到精通--第七话(自动补全、拼音分词器、自定义分词、数据同步方案)

    ElasticSearch从入门到精通–第七话(自动补全.拼音分词器.自定义分词.数据同步方案) 使用拼音分词 可以引入elasticsearch的拼音分词插件,地址:https://github.c ...

  8. Elasticsearch生产实战(ik分词器、拼音分词、自动补全、自动纠错)

    目录 一.IK分词器 1.IK分词器介绍 2.安装 3.使用 4.自定义词库 二.拼音分词器 1.拼音分词器介绍 2.安装 三.自动补全 1.效果演示 2.实战 四.自动纠错 1.场景描述 2.DSL ...

  9. [ElasticSearch]Suggest查询建议(自动补全纠错)

    1) 概念 查询建议,能够为用户提供良好的使用体验.主要包括:     拼写检查(纠错)     自动建议查询词(自动补全) 2) Suggest种类及参数 2.1 Term Suggester Te ...

最新文章

  1. windows安装redis数据库
  2. linux touch命令 新建文件 更新文件时间
  3. 大批量插入数据如何优化
  4. java swing jbutton_Java 反射
  5. 深度 | 一篇文章带你进入无监督学习:从基本概念到四种实现模型(附论文)
  6. Unfair contest(个人做法)
  7. 2020年快手母婴生态报告
  8. Command对象应用--增加问卷调查
  9. 图像的连通域标记算法及工具介绍
  10. MEncoder的基础用法—6.2. 选择输入文件或设备
  11. Android四大组件每个组件的作用?它们都可以开启多进程吗?
  12. 如何操作才能实现音频合并无缝衔接?只要掌握这个技巧
  13. java sdk qq登录授权_社会化登录分享-QQ SDK接入
  14. ArduinoUNO实战-第六章-电位器实验
  15. c语言向量乘法,运用C语言实现向量积
  16. html外联php,html如何添加css样式?行内式、内嵌式、外联式的优缺点
  17. Python实现Iris数据集(鸢尾花卉数据集)meanshift聚类
  18. This is probably not a problem with npm. There is likely additional logging output above.
  19. 思维方式-《终身成长》书中的精髓:决定人与人之间巨大差距的,是你的思维模式。
  20. 抖音二面:为什么模块循环依赖不会死循环?CommonJS和ES Module的处理不同?

热门文章

  1. (java)输入一个正整数n(1≤n≤6)和n阶方阵A,交换方阵A中的最大值与最小值位置。假定方阵A中的最大值与最小值都唯一。
  2. SQL Server 数据库设计规范
  3. 镜像与复制有什么区别_开发者如何快速精简容器云镜像?| 技术头条
  4. matlab dae,matlab解DAE遇到的问题
  5. 怎样将文件后缀名统一重命名并为大写字母
  6. 浅谈科研中作中的心得体会-讲座心得
  7. 具有多个项目的可访问拖放
  8. 【详细图文教程】通过UNiDAYS进行Apple教育优惠认证
  9. 600多万行的代码,苦撑12年的“乱项目”长这样
  10. 2021校招京东物流新锐之星校招笔试面试总结