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的很多天"
}

中英文的分词都具有了。

完整版索引创建+分词器

但是拼音分词器适合在创建倒排索引的时候使用,不能在搜索的时候使用。假如遇见同音不同字的,搜索时是按照中文搜索的,那么所有同音的就会全都被搜索出来,会出问题。!

如下:在文档中新增狮子、虱子后,查询时中文带狮子,但是因为查询时也同时使用了拼音分词器,所以虱子也会被查询

所以,我们可以在创建索引时使用ikpinyin分词器,但是查询时还是要根据用户输入的是中文还是拼音去选择分词器。

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从入门到精通--第七话(自动补全、拼音分词器、自定义分词、数据同步方案)相关推荐

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

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

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

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

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

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

  4. Elasticsearch高级使用-自动补全

    一.概念 注意事项 为了避免搜索同音字,搜索时不要使用拼音分词器 二.拼音分词器 官网https://github.com/medcl/elasticsearch-analysis-pinyin 安装 ...

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

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

  6. ElasticSearch第一讲:ElasticSearch从入门到精通

    ElasticSearch第一讲:ElasticSearch从入门到精通 业内目前来说事实上的一个标准,就是分布式搜索引擎一般大家都用elasticsearch.本文是ElasticSearch第一讲 ...

  7. wlan从入门到精通第七期直接转发和隧道转发

    wlan从入门到精通第七期直接转发和隧道转发 AC+FIT AP架构的网络中存在两种报文,一类是AC管理控制AP的报文,称为管理报文(也叫控制报文),另一类是STA的用户数据报文,称为业务报文. 如上 ...

  8. Elasticsearch从入门到精通 理论 集群 优化 框架集成

    Elasticsearch 入门 Elasticsearch 安装 下载软件 Elasticsearch 的官方地址:https://www.elastic.co/cn/ Elasticsearch ...

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

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

最新文章

  1. CSS之定位(绝对定位元素的布局)
  2. 基于OpenCV提取特定区域
  3. Spring MVC中用@ResponseBody转json,对json进行处理方法汇总
  4. 【深度学习】基于Pytorch多层感知机的高级API实现和注意力机制(二)
  5. 自考计算机及应用笔记,自考“计算机及应用”专业论文参考范文
  6. 【Tree】Prim算法思想与步骤
  7. Android--加载大分辨率图片到内存
  8. lua C++ wrapper
  9. linux防火墙配置说明,Linux防火墙配置命令参数说明
  10. 在计算机发展的早期 计算机主要用于,全国网络统考《计算机应用基础》选择题复习...
  11. latex正文显示运算符
  12. 免费送书的网站-每人限一本
  13. realtime multi-person 2D pose estimation using part affinity fields
  14. elasticsearch如何使用?
  15. Hbase ConnectionFactory
  16. 数塔问题-------给你有哪些启示?
  17. 动态物体检测(python)
  18. linux 延迟 10 ms,网络延迟10ms怎么做到(增加网络延迟软件)
  19. 灵雀云ACP成功通过金融信创生态实验室适配验证
  20. @TOM VIP邮箱,打造商务办公新场景,定位职场人的贴心助手!

热门文章

  1. 威联通nas怎么更换大硬盘_更换NAS后,数据如何安全处理?聊聊NAS数据安全性那些事...
  2. 苹果应用中含有第三方支付怎么办?
  3. 项目管理之项目集管理
  4. 中国幽门螺杆菌感染研究进展
  5. 数据库连接异常: HikariPool-1 - Connection is not available, request timed out after 30000ms.
  6. 九针串口接线问题, 232, 485
  7. 民俗杂事丨“大力丸”是壮阳药吗?
  8. EC MCAD Connector 3010 AdminGuide-2
  9. 获取服务器微信头像更改不同规格图片大小
  10. 简陋无匹的python学生信息管理系统