Davids实操笔记:Spring Boot使用docker整合ElasticSearch ik分词搜索和拼音搜索
文章目录
- Spring Boot使用docker整合ElasticSearch ik分词搜索和拼音搜索
- 准备工作
- 安装ik分词器
- 安装pinyin插件
- Spring Boot进行分词和拼音查询
- 创建setting和mapping文件
- 将setting和mapping配置到UserEntity中
- 编写测试类
- 总结
Spring Boot使用docker整合ElasticSearch ik分词搜索和拼音搜索
前面的blog已经处理完Spring Boot和docker安装配置ElasticSearch,这篇blog主要讲一下使用docker安装ElasticSearch ik分词器和拼音搜索功能。
准备工作
安装ik分词器
我们直接使用elasticsearch-plugin
安装ik分词器
// 进入elasticsearch容器
docker exec -it elasticsearch /bin/bash// 安装ik分词器7.8.0./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.8.0/elasticsearch-analysis-ik-7.8.0.zip
安装过程如下:
安装pinyin插件
和ik分词器一样我们同样使用elasticsearch-plugin
安装pinyin插件
// 安装ik分词器7.8.0./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v7.8.0/elasticsearch-analysis-pinyin-7.8.0.zip
检查一下plugins目录查看是否安装成功,准备工作就完成了。
Spring Boot进行分词和拼音查询
前面已经完成了一部分编码工作了,请查看Spring Boot 使用docker整合ElasticSearch,那么这次我们就继续在上次的基础上改造,使其支持拼音和分词搜索。
创建setting和mapping文件
文件存放在resource
目录下,为了方便区分,所以我新建了一个elasticsearch目录。
elasticsearch_mapping.json
文件内容
{"block": {"properties": {"userName": {"type": "text","analyzer": "pinyin_analyzer","search_analyzer": "pinyin_analyzer","fields": {"pinyin": {"type": "string","ignore_above": 256}}},"sex": {"type": "keyword","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"age": {"type": "keyword","fields": {"keyword": {"type": "keyword","ignore_above": 256}}}}}
}
elasticsearch_setting.json
文件内容
{"index": {"analysis": {"analyzer": {"pinyin_analyzer": {"tokenizer": "my_pinyin"}},"tokenizer": {"my_pinyin": {"type": "pinyin","keep_first_letter": true,"keep_separate_first_letter": false,"keep_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"lowercase": true,"remove_duplicated_term": true}}}}
}
将setting和mapping配置到UserEntity中
如果之前已经创建了索引了,则需要删除,或者重新创建新的所有才能创建分词和拼音相关索引,支持分词和拼音搜索
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.Mapping;
import org.springframework.data.elasticsearch.annotations.Setting;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Setting(settingPath = "classpath:elasticsearch/elasticsearch_setting.json")
@Mapping(mappingPath = "classpath:elasticsearch/elasticsearch_mapping.json")
@Document(indexName = "user")
public class UserEntity {@Idprivate Long userId;@Field(type = FieldType.Text, analyzer = "pinyin", searchAnalyzer = "pinyin")private String userName;@Field(type = FieldType.Keyword)private Integer age;@Field(type = FieldType.Keyword)private Integer sex;}
编写测试类
依旧是在之前的测试类基础上进行编写,首先执行save方法批量插入一些数据方便测试,然后执行searchByUserName
查看结果。
import com.example.elasticsearch.entity.UserEntity;
import com.example.elasticsearch.service.ElasticSearchService;
import com.example.elasticsearch.util.StringUtils;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;import javax.annotation.Resource;@SpringBootTest
class ElasticsearchApplicationTests {@Resourceprivate ElasticSearchService elasticSearchService;/*** @Author David* @Description 批量插入测试数据**/@Testvoid save() {List<String> randomName = StringUtils.getRandomName(100);List<UserEntity> list = new ArrayList<>(100);for (int i = 0; i < randomName.size(); i++) {UserEntity userEntity = UserEntity.builder().userId(i + 1L).userName(randomName.get(i)).age(ThreadLocalRandom.current().nextInt(50)).sex(ThreadLocalRandom.current().nextInt(2)).build();list.add(userEntity);}elasticSearchService.saveUser(list);}/*** @Author David* @Description 根据id搜索**/@Testvoid findById() {UserEntity byId = elasticSearchService.findById(1L);System.out.println(byId);}/*** @Author David* @Description 搜索**/@Testvoid searchByUserName() {List<UserEntity> da = elasticSearchService.searchByUserName("wpt");System.out.println(da);List<UserEntity> da1 = elasticSearchService.searchByUserName("闻平涂");System.out.println(da1);}}
// searchByUserName output
[UserEntity(userId=7, userName=闻平涂, age=44, sex=1)]
[UserEntity(userId=7, userName=闻平涂, age=44, sex=1)]
总结
ElasticSearch使用非常广泛,支持的场景也非常多,除了分词和拼音之外,还有像繁体搜索,以及高亮显示都用的比较多,后面一一梳理,如果对你有帮助记得关注支持一下哦,这是我前进的最大动力!
Davids实操笔记:Spring Boot使用docker整合ElasticSearch ik分词搜索和拼音搜索相关推荐
- Spring Boot项目中集成Elasticsearch,并实现高效的搜索功能
Spring Boot项目中集成Elasticsearch 前言 环境准备 引入依赖 配置Elasticsearch连接信息 定义实体类 定义Elasticsearch操作接口 实现搜索功能 总结 前 ...
- Spring Boot(九):整合elasticsearch并使用logstash同步数据
一到周末,就想在家里躺尸,逛逛B站,看看直播,打打游戏,美哉美哉.当然,作为一名有自我修养的程序员,学习也是必不可少的.前段时间,我司的另一个项目组接手的项目中用到了elasticsearch,我就查 ...
- Davids实操笔记:docker安装使用小米SQL分析工具Soar
文章目录 docker安装使用小米SQL分析工具Soar 背景 介绍 官网简介 功能特点 线路图 开始安装 使用Soar 访问SOAR-WEB SOAR配置 SQL分析 总结 docker安装使用小米 ...
- Spring Boot与Docker(一):微服务架构和容器化概述
本文讲的是Spring Boot与Docker(一):微服务架构和容器化概述,[编者的话]本篇是<使用Spring Boot和Docker构建微服务架构>系列四部曲的第一篇,本篇将会对我们 ...
- 浪潮式发售实操笔记(中国版)
浪潮式发售实操笔记(中国版) 覃小龙 中国互联网权威营销专家 沃克其人 产品发售公式的发明人叫杰夫·沃克,一个精彩的吊丝逆袭人生,他堪称互联网赚钱速度最快的人,目前是亚马逊创始人贝佐斯的创业教练. 杰 ...
- 实操笔记——笔记本加内存及清灰
实操笔记--笔记本加内存及清灰 写在前面 一.加内存 1 如何确定能否增加 1)当前电脑内存 2)系统是否支持 3)当前电脑支持的最大内存 4)内存条插槽数 2 如何选择内存条 首选确定当前内存条是几 ...
- 基于创龙TMS320C665x平台GigE工业相机图像采集案例实操笔记
基于创龙TMS320C665x平台GigE工业相机图像采集案例实操笔记 开发平台:创龙TL665x-EasyEVM: 基于TI KeyStone C66x多核定点/浮点DSP TMS320C665x, ...
- Spring Boot 2.x整合Quartz
宣传官网 xb.exrick.cn 在线Demo xboot.exrick.cn 开源版Github地址 github.com/Exrick/x-bo- 开发文档 www.kancloud.cn/ex ...
- spring boot使用Jedis整合Redis
文章目录 spring boot使用jedis整合redis 总结 Spring Boot整合Redis有两种方式,分别是Jedis和RedisTemplate,那么它们二者有什么区别呢? 1.Jed ...
- [Spring Boot]Druid datasource整合及配置
[Spring Boot]Druid datasource整合及配置 创建Spring Boot项目 这里使用默认配置创建一个空项目 demo-druid 用作演示,可跳过这一段: 只勾选基本的Spr ...
最新文章
- 字符串截取固定长度的方法
- 【数据结构】最小生成树 Prim算法 Kruskal算法
- 更高效的PacBio长read纠错算法的研究
- 【连载】优秀程序员的45个习惯之45——及时通报进展与问题
- SQL SERVER占用服务器内存过高的解决方案
- Java中Map的entrySet()详解 || Map.Entry的详解
- Swift 与 JSON 数据
- fscanf返回值被忽略怎么解决_pytest的fixture怎么用?
- CF 71C. Round Table Knights
- vs的windows应用程序上的鼠标为什么一直是加载状态?_了解 JavaScript 应用程序中的内存泄漏...
- 实习周记---20180519
- 2022SPSSPRO认证杯数学建模B题第二阶段方案及赛后总结:唐宋诗的定量分析与比较研究
- 前端常用标签与注意事项
- GCC学习(动态库与静态库.a与.so)
- 7个技巧让你写出干净的 TSX 代码
- unity 开发EasyAR发布IOS和安卓坑记录
- Hey Future!
- MatLab矩阵的创建、寻访和运算
- VC++获取不同Windows版本的方法
- 数据规模超大,分布密集,数据存储难