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.mzph.cn/news/617502.shtml

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

相关文章

高质量训练数据助力大语言模型摆脱数据困境 | 景联文科技

目前&#xff0c;大语言模型的发展已经取得了显著的成果&#xff0c;如OpenAI的GPT系列模型、谷歌的BERT模型、百度的文心一言模型等。这些模型在文本生成、问答系统、对话生成、情感分析、摘要生成等方面都表现出了强大的能力&#xff0c;为自然语言处理领域带来了新的突破。 …

ROS2——launcher

在ROS2中&#xff0c;launcher 文件是通过Python构建的&#xff0c;它们的功能是声明用哪些选项或参数来执行哪些程序&#xff0c;可以通过 launcher 文件快速同时启动多个节点。一个 launcher 文件内可以引用另一个 launcher 文件。 使用 launcher 文件 ros2 launch 可以代替…

掌握 Vue 响应式系统,让数据驱动视图(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

GitLab任意用户密码重置漏洞(CVE-2023-7028)

GitLab CVE-2023-7028 POC user[email][]validemail.com&user[email][]attackeremail.com 本文链接&#xff1a; https://www.黑客.wang/wen/47.html

Webhook端口中的自定义签名身份认证

概述 如果需要通过 Webhook 端口从交易伙伴处接收数据&#xff0c;但该交易伙伴可能对于安全性有着较高的要求&#xff0c;而不仅仅是用于验证入站 Webhook 要求的基本身份验证用户名/密码&#xff0c;或者用户可能只想在入站 Webhook 消息上增加额外的安全层。 使用 Webhook…

【数据采集与预处理】流数据采集工具Flume

目录 一、Flume简介 &#xff08;一&#xff09;Flume定义 &#xff08;二&#xff09;Flume作用 二、Flume组成架构 三、Flume安装配置 &#xff08;一&#xff09;下载Flume &#xff08;二&#xff09;解压安装包 &#xff08;三&#xff09;配置环境变量 &#xf…

环形链表[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个链表的头节点head&#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪next指针再次到达&#xff0c;则链表中存在环。为了表示给定链表中的环&#xff0c;评测系统内部使用整数pos来表示链…

数据结构中的一棵树

一、树是什么&#xff1f; 有根有枝叶便是树&#xff01;根只有一个&#xff0c;枝叶可以有&#xff0c;也可以没有&#xff0c;可以有一个&#xff0c;也可以有很多。 就像这样&#xff1a; 嗯&#xff0c;应该是这样&#xff1a; 二、一些概念 1、高度 树有多高&#x…

MySQL之导入导出远程备份(详细讲解)

文章目录 一、Navicat导入导出二、mysqldump命令导入导出2.1导出2.2导入&#xff08;使用mysqldump导入 包含t_log表的整个数据库&#xff09; 三、LOAD DATA INFILE命令导入导出3.1设置;3.2导出3.3导入(使用单表数据导入load data infile的方式) 四、远程备份4.1导出4.2导入 一…

redis系列:01 数据类型及操作

redis的数据类型有哪些 string,list,set,sorted_set,hash 操作 sting: set name maliao get name exists name expire name 5 ttl name del name setex name 10 maliao 设置key和过期时间 setnx name maliao 当key不存在时才添加list&#xff1a; lpush letter a lpush le…

OpenCV-22高斯滤波

一、高斯函数的基础 要理解高斯滤波首先要直到什么是高斯函数&#xff0c;高斯函数是符合高斯分布的&#xff08;也叫正态分布&#xff09;的数据的概率密度函数。 高斯函数的特点是以x轴某一点&#xff08;这一点称为均值&#xff09;为对称轴&#xff0c;越靠近中心数据发生…

【Linux实用篇】Linux常用命令(1)

目录 1.1 Linux命令初体验 1.1.1 常用命令演示 1.1.2 Linux命令使用技巧 1.1.3 Linux命令格式 1.2 文件目录操作命令 1.2.1 ls 1.2.2 cd 1.2.3 cat 1.2.4 more 1.2.5 tail 1.2.6 mkdir 1.2.7 rmdir 1.2.8 rm 1.1 Linux命令初体验 1.1.1 常用命令演示 在这一部分中…

遥感影像-语义分割数据集:Landsat8云数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;该云数据集包括RGB三通道的高分辨率图像&#xff0c;在全球不同区域的分辨率15米。这些图像采集自Lansat8的五种主要土地覆盖类型&#xff0c;即水、植被、湿地、城市、冰雪和贫瘠土地。 KeyValue卫星类型landsat8覆盖区域未知场景水、植被、…

uniapp中按钮点击跳转页面失效,纠正错误(亲测可用)

不知道伙伴你的错误和我是否一致&#xff1f; 我当时为了点击跳转按钮发现跳转不了&#xff0c;如下错误提示&#xff1a; worker.js?libNameWAAccelerateWorker.js:1 [Deprecation] SharedArrayBuffer will require cross-origin isolation as of M92, around July 2021. S…

【Java SE语法篇】6.数组

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ 文章目录 1.数组的基本概念1.1 为什么使用数组&#xff1f;1.…

MATLAB - 四旋翼飞行器动力学方程

系列文章目录 前言 本例演示了如何使用 Symbolic Math Toolbox™&#xff08;符号数学工具箱&#xff09;推导四旋翼飞行器的连续时间非线性模型。具体来说&#xff0c;本例讨论了 getQuadrotorDynamicsAndJacobian 脚本&#xff0c;该脚本可生成四旋翼状态函数及其雅各布函数…

streamlit中文开发手册(详细版)

目录 一、安装与配置 1.1 安装 Streamlit 1.2 配置文件 1.3 运行Streamlit应用 二、streamlit显示数据 2.1 显示标题 2.2 显示文本 2.3 显示代码段 2.4 通用显示方法 2.5 显示表格 2.6 显示JSON 2.7 显示pyplot图表 2.8 显示地图 2.9 显示图像 2.10 显示视频 三…

2024年腾讯云新用户专属优惠活动及代金券活动汇总

腾讯云作为国内领先的云计算服务提供商&#xff0c;一直致力于为用户提供优质、高效的服务。为了更好地满足新用户的需求&#xff0c;腾讯云在2024年推出了一系列新用户专属优惠活动和代金券活动。本文将为大家详细介绍这些活动&#xff0c;帮助大家更好地了解和利用这些优惠。…

Gogs - 管理协作者

Gogs - 管理协作者 References 仓库设置 管理协作者 权限设置 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Android 13(T) - Media框架(2)- libmedia

这一节学习有两个目标&#xff1a; 1 熟悉Android Media API的源码路径与调用层次 2 从MediaPlayer的创建与销毁了解与native的串接 1、源码路径 Media相关的API位于&#xff1a;frameworks/base/media/java/android/media&#xff0c;里面提供有MediaPlayer MediaCodecList M…