ElasticSearch 学习9 spring-boot ,elasticsearch7.16.1实现中文拼音分词搜索

一、elasticsearch官网下载:Elasticsearch 7.16.1 | Elastic

二、拼音、ik、繁简体转换插件安装

ik分词:GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.

拼音分词:GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is used to do conversion between Chinese characters and Pinyin.

繁简体转换:GitHub - medcl/elasticsearch-analysis-stconvert: STConvert is analyzer that convert chinese characters between traditional and simplified.中文简繁體互相转换.

安装过程:从github上下载源码到本地,idea打开项目,修改对应项目中的pom.xml将

<elasticsearch.version>7.16.1</elasticsearch.version>修改为对应的elasticsearch版本

,alt+f12打开cmd命令界面,输入mvn install,项目编译成功后会在对应目录中生成对应zip包,效果如图:

将对应zip包解压到elasticsearch存放目录的plugins下:

重新给把lasticsearch的文件权限给用户elastic 

chown -R elastic /usr/local/elasticsearch-7.16.1/

不然报权限的错误哦

然后启动elasticsearch.bat,

这样对应插件就算安装成功了

三. mvn,及yml配置

  <elasticsearch.version>7.16.1</elasticsearch.version><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId><version>3.1.3.RELEASE</version></dependency><dependency><groupId>org.elasticsearch.plugin</groupId><artifactId>x-pack-sql-jdbc</artifactId><version>${elasticsearch.version}</version></dependency>
  # ElasticSearch 7设置elasticsearch:schema: httphost: 123.456port: 9200userName: espassword:3333indexes: index

四. es工具类

此次在原来的基础上主要是加了创建索引时可选则索引库的默认分词器类型,可选pinyin

CreateIndexRequest request = new CreateIndexRequest(indexName);
request.settings(Settings.builder()//.put("analysis.analyzer.default.type", "ik_max_word")//.put("analysis.analyzer.default.type", "pinyin")//同时支持拼音和文字.put("analysis.analyzer.default.type", indexType)
import com.alibaba.fastjson.JSON;
import io.micrometer.core.instrument.util.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** @author ylwang* @create 2021/7/27 9:16*/
@Configuration
public class ElasticSearchClientConfig {/*** 协议*/@Value("${jeecg.elasticsearch.schema}")private String schema;/*** 用户名*/@Value("${jeecg.elasticsearch.userName}")private String userName;/*** 密码*/@Value("${jeecg.elasticsearch.password}")private String password;/*** 地址*/@Value("${jeecg.elasticsearch.host}")private String host;/*** 地址*/@Value("${jeecg.elasticsearch.port}")private String port;public final   String   AIOPENQAQINDEXNAME = "aiopenqaq"; //ai问题库索引名public final   String   AIYunLiao = "aiyunliao"; //ai语料库索引名public final   String   KNOWLEDGE = "knowledge";//知识库索引名public static RestHighLevelClient restHighLevelClient;@Beanpublic RestHighLevelClient restHighLevelClient() {restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost(host, Integer.parseInt(port), schema)));//验证用户密码final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(host, Integer.parseInt(port), schema)).setHttpClientConfigCallback(httpClientBuilder -> {httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);return httpClientBuilder;}).setRequestConfigCallback(requestConfigBuilder -> {return requestConfigBuilder;});restHighLevelClient = new RestHighLevelClient(restClientBuilder);return restHighLevelClient;}/*** 判断索引是否存在* @return 返回是否存在。* 		<ul>* 			<li>true:存在</li>* 			<li>false:不存在</li>* 		</ul>*/public boolean existIndex(String index){GetIndexRequest request = new GetIndexRequest();request.indices(index);boolean exists;try {exists = restHighLevelClient().indices().exists(request, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();return false;}return exists;}/*** 查询并分页* @param indexName 索引名字* @param from 从第几条开始查询,相当于 limit a,b 中的a ,比如要从最开始第一条查,可传入: 0* @param size 本次查询最大查询出多少条数据 ,相当于 limit a,b 中的b* @return {@link SearchResponse} 结果,可以通过 response.status().getStatus() == 200 来判断是否执行成功*获取总条数的方法* TotalHits totalHits = searchResponse.getHits().getTotalHits();**/public SearchResponse search(String indexName, SearchSourceBuilder searchSourceBuilder, Integer from, Integer size){SearchRequest request = new SearchRequest(indexName);searchSourceBuilder.from(from);searchSourceBuilder.size(size);request.source(searchSourceBuilder);SearchResponse response = null;try {response = restHighLevelClient().search(request, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return response;}/*** 根据索引中的id查询* @param indexName* @param id* @return*/public String searchById(String indexName,String id){SearchRequest request = new SearchRequest(indexName);request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("_id",id)));SearchResponse response = null;try {response = restHighLevelClient().search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();SearchHit[] hits1 = hits.getHits();for (SearchHit fields : hits1) {return fields.getSourceAsString();}} catch (IOException e) {e.printStackTrace();}return null;}/*** 创建索引** @param indexName 要创建的索引的名字,传入如: testindex* @param indexType 索引类型 : ik_max_word 和 pinyin* @return 创建索引的响应对象。可以使用 {@link CreateIndexResponse#isAcknowledged()} 来判断是否创建成功。如果为true,则是创建成功*/public CreateIndexResponse createIndex(String indexName,String indexType)  {CreateIndexResponse response=null;if(existIndex(indexName)){response = new CreateIndexResponse(false, false, indexName);return response;}if(StringUtils.isBlank(indexType)){indexType="ik_max_word";}CreateIndexRequest request = new CreateIndexRequest(indexName);request.settings(Settings.builder()//.put("analysis.analyzer.default.type", "ik_max_word")//.put("analysis.analyzer.default.type", "pinyin")//同时支持拼音和文字.put("analysis.analyzer.default.type", indexType));try {response = restHighLevelClient().indices().create(request, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return response;}/*** 数据添加,网 elasticsearch 中添加一条数据* @param params 要增加的数据,key-value形式。 其中map.value 支持的类型有 String、int、long、float、double、boolean* @param indexName 索引名字,类似数据库的表,是添加进那个表* @param id 要添加的这条数据的id, 如果传入null,则由es系统自动生成一个唯一ID* @return 创建结果。如果 {@link IndexResponse#getId()} 不为null、且id长度大于0,那么就成功了*/public IndexResponse put(String params, String indexName, String id){//创建请求IndexRequest request = new IndexRequest(indexName);if(id != null){request.id(id);}request.timeout(TimeValue.timeValueSeconds(5));IndexResponse response = null;try {response = restHighLevelClient().index(request.source(params, XContentType.JSON).setRefreshPolicy("wait_for"), RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return response;}/*** 数据更新* @param params 要更新 的数据,key-value形式。 其中map.value 支持的类型有 String、int、long、float、double、boolean* @param indexName 索引名字,类似数据库的表,是添加进那个表* @param id 要添加的这条数据的id, 如果传入null,则由es系统自动生成一个唯一ID* @return 创建结果。如果 {@link IndexResponse#getId()} 不为null、且id长度大于0,那么就成功了*/public UpdateResponse update(String params, String indexName, String id){//创建请求UpdateRequest request = new UpdateRequest(indexName,id);request = request.doc(params, XContentType.JSON);request.setRefreshPolicy("wait_for");request.timeout(TimeValue.timeValueSeconds(5));UpdateResponse response = null;try {response = restHighLevelClient().update(request, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return  response;}/*** 删除索引* @param indexName* @throws IOException*/public AcknowledgedResponse deleteIndex(String indexName)   {DeleteIndexRequest request = new DeleteIndexRequest(indexName);AcknowledgedResponse response = null;try {response = restHighLevelClient().indices().delete(request, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}System.out.println(response.isAcknowledged());return response;}/*** 通过elasticsearch数据的id,来删除这条数据* @param indexName 索引名字* @param id 要删除的elasticsearch这行数据的id*/public boolean deleteById(String indexName, String id) {DeleteRequest request = new DeleteRequest(indexName, id);request.setRefreshPolicy("wait_for");DeleteResponse delete = null;try {delete = restHighLevelClient().delete(request, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();//删除失败return false;}if(delete == null){//这种情况应该不存在return false;}if(delete.getResult().equals(DocWriteResponse.Result.DELETED)){return true;}else{return false;}}}

五,创建索引,插入数据

@Resource
private ElasticSearchClientConfig es;@Resource
private AiOpenqaQMapper aiOpenqaQMapper;@Overridepublic int selectNums(String applicationId) {return aiOpenqaQMapper.selectNums(applicationId);}@Overridepublic boolean saveAndEs(AiOpenqaQ aiOpenqaQ) {// es.deleteIndex(es.AIOPENQAQINDEXNAME);boolean save = this.save(aiOpenqaQ);if(save){if(!es.existIndex(es.AIOPENQAQINDEXNAME)){es.createIndex(es.AIOPENQAQINDEXNAME,"pinyin");}es.put(JsonMapper.toJsonString(aiOpenqaQ), es.AIOPENQAQINDEXNAME,aiOpenqaQ.getId());}return true;}
}

六,验证

同音词查询

直接拼音

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/236666.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[开发语言][c++][python]:C++与Python中的赋值、浅拷贝与深拷贝

C与Python中的赋值、浅拷贝与深拷贝 1. Python中的赋值、浅拷贝、深拷贝2. C中的赋值、浅拷贝、深拷贝2.1 概念2.2 示例&#xff1a;从例子中理解1) 不可变对象的赋值、深拷贝、浅拷贝2) 可变对象的赋值、浅拷贝与深拷贝3) **可变对象深浅拷贝(外层、内层改变元素)** 写在前面&…

Salesforce财务状况分析

纵观Salesforce发展史和十几年财报中的信息&#xff0c;Salesforce从中小企业CRM服务的蓝海市场切入&#xff0c;但受限于中小企业的生命周期价值和每用户平均收入小且获客成本和流失率不对等&#xff0c;蓝海同时也是死海。 Salesforce通过收购逐渐补足品牌和产品两块短板&am…

系统架构设计师教程(十)软件可靠性基础知识

软件可靠性基础知识 10.1 软件架构演化和定义的关系10.1.1 演化的重要性10.1.2 演化和定义的关系 10.2 面向对象软件架构演化过程10.2.1 对象演化10.2.2 消息演化10.2.3 复合片段演化10.2.4 约束演化 10.3 软件架构演化方式的分类10.3.1 软件架构演化时期10.3.2 软件架构静态演…

mp4文件全部转换为mp3

问题 今天突发奇想&#xff0c;想把mp4视频转换为mp3来收听&#xff0c;于是想到了ffmpeg工具 步骤 安装ffmpeg环境 要在 Windows 上配置 FFmpeg 环境&#xff0c;你可以按照以下步骤进行操作&#xff1a; 下载 FFmpeg&#xff1a; 首先&#xff0c;你需要下载 FFmpeg 的 W…

C#进阶-IIS服务器发布ASP.NET项目

对于云服务器&#xff0c;程序员一般不会陌生&#xff0c;如果项目需要发布到现网&#xff0c;那么服务器是必不可缺的一项硬性条件&#xff0c;那么如何在云服务器上部署一个项目&#xff0c;需要做哪些配置准备&#xff0c;下面就由本文档为大家讲解&#xff0c;本篇以 IIS服…

暴打小苹果

欢迎来到程序小院 暴打小苹果 玩法&#xff1a;鼠标左键点击任意区域可发招暴打&#xff0c;在苹果到达圆圈时点击更容易击中&#xff0c; 30秒挑战暴打小苹果&#xff0c;打中一次20分&#xff0c;快去暴打小苹果吧^^。开始游戏https://www.ormcc.com/play/gameStart/247 htm…

PXE 高效批量网络装机

前提&#xff1a; 虚拟机恢复到初始化 调整网卡为vm1 关闭防火墙 安全linux systemctl stop firewalld vim /etc/selinux/config 配置IP地址 vim /etc/sysconfig/network-scripts/ifcfg-ens33 重启网卡 systemctl restart network 挂载磁盘 安装yum源 安装服务 yum install vs…

uni-app做A-Z排序通讯录、索引列表

上图是效果图&#xff0c;三个问题 访问电话通讯录&#xff0c;拿数据拿到用户的联系人数组对象&#xff0c;之后根据A-Z排序根据字母索引快速搜索 首先说数据怎么拿 - 社区有指导https://ask.dcloud.net.cn/question/64117 uniapp 调取通讯录 // #ifdef APP-PLUSplus.contac…

【Git】本地仓库文件的创建、修改和删除

目录 一、基本信息设置 1、设置用户名2、设置用户名邮箱 二、Git仓库操作介绍 1、创建一个新的文件夹2、在文件内初始化git仓库&#xff08;创建git仓库&#xff09;3、向仓库中添加文件 1.创建一个文件2.将文件添加到暂存区3.将暂存区添加到仓库 4、修改仓库文件 1.修改文件2.…

基于JAVA+SpringBoot的咖啡商城

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着互联网的普及和发…

Windows下Redis5+可视化软件下载、安装和配置教程-2024年1月8日

Windows下Redis5下载、安装和配置教程-2024年1月8日 一、下载二、安装三、配置环境四、配置可视化客户端 一、下载 redis是现在是没有对win系统版进行维护的&#xff0c;这个是大神完成的&#xff0c;目前是到5版本&#xff0c;选择Redis-x64-5.0.14.1.zip点击下载 下载地址&…

使用Navicat导入csv数据至mysql

问题 使用Navicat导入csv数据至mysql 详细问题 笔者有已进行数据处理的csv&#xff0c;需要将数据信息导入mysql中 解决方案 步骤1、建立数据表&#xff0c;字段信息&#xff08;最好&#xff09;与csv字段信息保持一致&#xff0c;方便后续导入。 具体的&#xff0c;双击…

Surface mesh结构学习

CGAL 5.6 - Surface Mesh: User Manual Surface_mesh 类是半边数据结构的实现&#xff0c;可用来表示多面体表面。它是半边数据结构&#xff08;Halfedge Data Structures&#xff09;和三维多面体表面&#xff08;3D Polyhedral Surface&#xff09;这两个 CGAL 软件包的替代品…

2023一带一路暨金砖国家技能发展与技术创新大赛“网络安全”赛项省选拔赛样题卷①

2023金砖国家职业技能竞赛"网络安全" 赛项省赛选拔赛样题 2023金砖国家职业技能竞赛 省赛选拔赛样题第一阶段&#xff1a;职业素养与理论技能项目1. 职业素养项目2. 网络安全项目3. 安全运营 第二阶段&#xff1a;安全运营项目1. 操作系统安全配置与加固任务一Linux …

OpenGL排坑指南—贴图纹理绑定和使用

一、前言 在OpenGL学习 的纹理这一章中讲述了纹理贴图的使用方式&#xff0c;主要步骤是先创建一个纹理的对象&#xff0c;和创建顶点VAO类似&#xff0c;然后就开始绑定这个纹理&#xff0c;最后在循环中使用&#xff0c;有时候可能还要用到激活纹理单元的函数。然而&#xff…

聚对苯二甲酸乙二醇酯PET的特性有哪些?UV胶水能够粘接聚对苯二甲酸乙二醇酯PET吗?又有哪些优势呢?

聚对苯二甲酸乙二醇酯&#xff08;Polyethylene Terephthalate&#xff0c;PET&#xff09;是一种常见的塑料材料&#xff0c;具有许多特性&#xff0c;包括&#xff1a; 1.化学式&#xff1a; PET的化学式为 (C10H8O4)n&#xff0c;其中n表示重复单元的数量。 2.透明度&#…

4.4 媒资管理模块 - 分布式任务处理介绍、视频处理技术方案

媒资管理模块 - 视频处理 文章目录 媒资管理模块 - 视频处理一、视频转码1.1 视频转码介绍1.2 FFmpeg 基本使用1.2.1 下载安装配置1.2.2 转码测试 1.3 工具类1.3.1 VideoUtil1.3.2 Mp4VideoUtil1.3.3 测试工具类 二、分布式任务处理2.1 分布式任务调度2.2 XXL-JOB 配置执行器 中…

C++(10)——模板

目录 1.什么是泛式编程以及模板的引入&#xff1a; 2. 模板&#xff1a; 2.1 函数模板&#xff1a; 2.2 类模板&#xff1a; 1.什么是泛式编程以及模板的引入&#xff1a; 在之前排序的部分中&#xff0c;为了完成某个特定功能&#xff0c;经常会用到交换函数&#xff0c;即…

Jenkins安装和配置

拉取Jenkins镜像 docker pull jenkins/jenkins 编写jenkins_docker.yml version: "3.1" services:jenkins:image: jenkins/jenkinscontainer_name: jenkinsports:- 8080:8080- 50000:50000volumes:- ./data/:/var/jenkins_home/首次启动会因为数据卷data目录没有权限…

强化学习在生成式预训练语言模型中的研究现状简单调研

1. 绪论 本文旨在深入探讨强化学习在生成式预训练语言模型中的应用&#xff0c;特别是在对齐优化、提示词优化和经验记忆增强提示词等方面的具体实践。通过对现有研究的综述&#xff0c;我们将揭示强化学习在提高生成式语言模型性能和人类对话交互的关键作用。虽然这些应用展示…