提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、先上效果图
  • 二、实现步骤
    • 1.准备环境
    • 2.创建索引
  • 添加数据测试搜索接口

前言

最近复习ES,想到之前用过ES6实现ik+pinyin分词器,打算换换ES7来实现一下。

一、先上效果图

接口填写pg两个字母成功匹配到存ES的三条苹果相关数据。

二、实现步骤

1.准备环境

推荐window10可以使用docker Desktop

docker pull elasticsearch:7.6.2
docker run --name elasticsearch  -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch:7.6.2
在es容器内config目录elasticsearch.yml加入对外开放配置
http.cors.enabled: true
http.cors.allow-origin: "*"
下载分词器,可以从中文社区找 https://elasticsearch.cn/download/
将ik pinyin分词器用 dokcer cp 命令复制到容器plugins目录并解压
docker cp ./elasticsearch-analysis-ik-7.6.2.zip elasticsearch:/usr/share/elasticsearch/plugins
unzip elasticsearch-analysis-pinyin-7.6.2.zip -d elasticsearch-analysis-pinyin-7.6.2
unzip elasticsearch-analysis-pinyin-7.6.2.zip -d elasticsearch-analysis-pinyin-7.6.2
重启es
docker restart elasticsearch

2.创建索引

postman put请求 localhost:9200/product 创建名为product的索引,并配置了ik结合pinyin的分词器起名 ik_pinyin_analyzer,此时索引的mapping并没有添加。
请求体如下

{"settings":{"index":{"number_of_replicas":"0","number_of_shards":"1","analysis":{"analyzer":{"ik_pinyin_analyzer":{"tokenizer":"my_ik_pinyin","filter":"pinyin_first_letter_and_full_pinyin_filter"},"pinyin_analyzer":{"tokenizer":"my_pinyin"}},"tokenizer":{"my_ik_pinyin":{"type":"ik_max_word"},"my_pinyin":{"type":"pinyin","keep_first_letter":true,"keep_separate_first_letter":false,"keep_full_pinyin":false,"keep_joined_full_pinyin":true,"keep_none_chinese":true,"none_chinese_pinyin_tokenize":false,"keep_none_chinese_in_joined_full_pinyin":true,"keep_original":false,"limit_first_letter_length":16,"lowercase":true,"trim_whitespace":true,"remove_duplicated_term":true}},"filter":{"pinyin_first_letter_and_full_pinyin_filter":{"type":"pinyin","keep_first_letter":true,"keep_separate_first_letter":false,"keep_full_pinyin":false,"keep_joined_full_pinyin":true,"keep_none_chinese":true,"none_chinese_pinyin_tokenize":false,"keep_none_chinese_in_joined_full_pinyin":true,"keep_original":false,"limit_first_letter_length":16,"lowercase":true,"trim_whitespace":true,"remove_duplicated_term":true}}}}}}

实体类代码如下

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "product")
public class Product {@Field(store = true,type = FieldType.Keyword)private Long id;@MultiField(mainField = @Field(type = FieldType.Keyword),otherFields = {@InnerField(type = FieldType.Text, suffix = "ik", analyzer = "ik_max_word", searchAnalyzer = "ik_max_word"),@InnerField(type = FieldType.Text, suffix = "ik_pinyin", analyzer = "ik_pinyin_analyzer", searchAnalyzer = "ik_pinyin_analyzer"),@InnerField(type = FieldType.Text, suffix = "pinyin", analyzer = "pinyin_analyzer", searchAnalyzer = "pinyin_analyzer")})private String name;@MultiField(mainField = @Field(type = FieldType.Keyword),otherFields = {@InnerField(type = FieldType.Text, suffix = "ik", analyzer = "ik_max_word", searchAnalyzer = "ik_max_word"),@InnerField(type = FieldType.Text, suffix = "ik_pinyin", analyzer = "ik_pinyin_analyzer", searchAnalyzer = "ik_pinyin_analyzer"),@InnerField(type = FieldType.Text, suffix = "pinyin", analyzer = "pinyin_analyzer", searchAnalyzer = "pinyin_analyzer")})private String category;@MultiField(mainField = @Field(type = FieldType.Keyword),otherFields = {@InnerField(type = FieldType.Text, suffix = "ik", analyzer = "ik_max_word", searchAnalyzer = "ik_max_word"),@InnerField(type = FieldType.Text, suffix = "ik_pinyin", analyzer = "ik_pinyin_analyzer", searchAnalyzer = "ik_pinyin_analyzer"),@InnerField(type = FieldType.Text, suffix = "pinyin", analyzer = "pinyin_analyzer", searchAnalyzer = "pinyin_analyzer")})private String tag;@Field(store = true, type = FieldType.Double)private Double price;}

代码上利用springbooot-elasticsearch提供的elasticsearchRestTemplate的方法对实体类Product创建mapping。详细代码见github

    public JSONResult create() {Document b = esTemplate.indexOps(Product.class).createMapping(Product.class);boolean putMapping = esTemplate.indexOps(Product.class).putMapping(b);return JSONResult.ok(putMapping);}

此时可以使用es-header插件查看索引mappings是否能和product实体类对上。


添加数据测试搜索接口

搜索接口代码如下
@Override
public JSONResult select(String keyword) {
Pageable pageable = PageRequest.of(0, 10);

    SortBuilder sortBuilder = new FieldSortBuilder("price").order(SortOrder.ASC);QueryBuilder queryBuilder = QueryBuilders.boolQuery()// 当输入简拼时会被ik-pinyin分词器命中.should(QueryBuilders.matchQuery("name.ik_pinyin",keyword).boost(2))// 当输入文字时会被ik分词器命中.should(QueryBuilders.matchQuery("name.ik",keyword).boost(2))// 分类字段也可能匹配上.should(QueryBuilders.matchQuery("category.ik",keyword).boost(1)).should(QueryBuilders.matchQuery("tag.ik",keyword).boost(1));NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(queryBuilder).withPageable(pageable).withSort(sortBuilder).build();SearchHits<Product> searchHits = esTemplate.search(query, Product.class);List<SearchHit<Product>> data = searchHits.getSearchHits();return JSONResult.ok(data);
}

之后就可以使用添加接口添加数据

    public JSONResult add(ProductBO product) {Product p = new Product(product.getId(), product.getName(), product.getCategory(),product.getTag(), product.getPrice());Product save = esTemplate.save(p);return JSONResult.ok(save);}

至此ES7 ik结合pinyin分词器实现简拼搜索已经完成,看起来花里胡哨估计实际场景没多少地方会用。

ES7 ik结合pinyin实现简拼搜索相关推荐

  1. boot spring 简拼_超牛逼的下拉字典框架,支持拼音简拼搜索,代码项、代码值搜索,无限层级级联,多选、过滤自定义数据表等等...

    Dic扩展模块 Dic数据字典模块是v-ci的核心之一,为解决大数据量下拉字典效率及操作问题,特推出通用的数据字典模块,所有字典数据可在数据库维护,在大数据量时采用分页下拉的展示方式,同时支持拼音简拼 ...

  2. Android模糊查询(首字母、简拼、全拼,汉字)

    最近公司需要模糊查询城市要求汉字.全拼.简写.一脸懵逼.然后各种百度.都是关于通讯录的.而且都是数据库.和自己的需求不一样.没办法.这个大神里面看一看,那个看一看,将自己的需求完善了.为防止以后还有这 ...

  3. 城市查询-汉字转拼音、拼音、全拼、简拼、混拼、卷舌音、前后鼻音、兼容查询C#与nodejs+redis应用---笔记

    2018-10-18日整理更新 原文地址:http://blog.csdn.net/gzy11/article/details/52351697 实现主要功能: 1.全拼搜索.如:shanghai 搜 ...

  4. Android通讯录模糊查询搜索(号码,姓名,首字母简拼,全拼),批量选取联系人

    Android通讯录模糊查询搜索(号码,姓名,首字母简拼,全拼),批量选取联系人 公司最近的项目中遇到一个需求需要读取通讯录联系人,并需要支持对联系人的模糊查询及批量选取,网上找了好几个例子,模糊查询 ...

  5. Android通讯录模糊匹配搜索实现 号码 首字母 简拼 全拼

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Andr ...

  6. Android通讯录模糊匹配搜索实现(号码、首字母、简拼、全拼)

    Android通讯录模糊匹配搜索实现(号码.首字母.简拼.全拼) 2013年12月10日 工作记录 小巫在工作中碰到一个需求,要求实现通讯录联系人的搜索,获取联系人的方式有好几种,我都有点混乱了,下面 ...

  7. Android通讯录模糊匹配搜索实现(号码 首字母 简拼 全拼)

    Android通讯录模糊匹配搜索实现(号码.首字母.简拼.全拼) 2013年12月10日 工作记录 小巫在工作中碰到一个需求,要求实现通讯录联系人的搜索,获取联系人的方式有好几种,我都有点混乱了,下面 ...

  8. react根据中文获取拼音_vue 获取汉字的全拼、简拼、首拼

    1.封装公共方法,获取汉字的全拼.简拼.首拼 export const Pinyin = { _JMcode:{ "-":"", "-":& ...

  9. EasyUI下combobox中添加checkbox,并输入全拼简拼进行筛选显示

    开发任务:combobox中对输入值进行全拼简拼的搜索筛选显示,并且可以多选,取消选择,重复搜索,于是简单的考虑了如下js操作,应该会有更好的,但也是一种方法吧.做个记录,便于后期查阅查考. 1.ht ...

最新文章

  1. JVM内存管理:深入Java内存区域与OOM
  2. 视频云峰会|“超视频化时代的全景创新” 是什么?
  3. 阅读react-redux源码 - 零
  4. 目前市场上的电脑一体机从计算机种类,一体机电脑与普通电脑的区别
  5. Windows DNS Server 远程代码执行漏洞 (CVE-2021-24078) 的详细原理分析
  6. 洛谷 P4344 [SHOI2015]脑洞治疗仪
  7. BAT中一行太长,如何折行
  8. 利用python做淘宝_利用Python爬虫爬取淘宝商品做数据挖掘分析实战篇,超详细教程...
  9. 微信公众号授权H5页面
  10. 二叉搜索树(城市数据库)
  11. [云原生专题-59]:Kubesphere云治理-操作-分步部署Web业务平台RuoYi Cloud项目 - 手工上云部署实际过程全部操作步骤
  12. Python练习数据结构笔记
  13. 关于ruoyi框架集成activiti步骤
  14. 自动驾驶领域常见英文缩写及其中文含义(不断完善中)
  15. packet tracer 学习ARP报文请求
  16. 检测屏幕.html,在线检测显示器屏幕尺寸
  17. 【面试通关篇】13个offer,8家SSP,谈谈我的秋招经验
  18. 移动测试基础 Android 应用测试总结
  19. 产品开发阶段 EVT DVT PVT MP
  20. 浙江计算机二级考哪些专业好,浙江省计算机二级都考什么

热门文章

  1. matlab语音去除白噪声_Matlab高级教程_第四篇:白噪声的MATALB生成方式
  2. Q1.ESX不能联网
  3. 深度:一套系统从无到有的设计
  4. java毕业设计二手书店设计mybatis+源码+调试部署+系统+数据库+lw
  5. 数据库自增id,根据当前时间更新插入数据时间
  6. php plog使用,pLog安装在PHP5下无法进入管理界面问题的解决
  7. R语言迹检验协整关系式_R语言做协整检验
  8. c语言接口与实现作用,《C语言接口与实现》
  9. nrm : 无法加载文件 C:\Users\HUAWEI\AppData\Roaming\npm\nrm.ps1,因为在此系统上禁止运行脚本
  10. Git使用 从入门到入土 收藏吃灰系列 (八) 什么是分支 分支的作用