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;为自然语言处理领域带来了新的突破。 …

Spring Boot集成Redis简单示例

要在Spring Boot中集成Redis&#xff0c;你可以使用Spring Data Redis库来简化操作。 下面是一个示例代码&#xff1a; 首先&#xff0c;在你的Spring Boot项目的pom.xml文件中添加以下依赖&#xff1a; <dependencies><!-- 其他依赖... --><dependency>&…

springboot启动加载数据库数据到内存

1、概述 一般来说&#xff0c;springboot工程环境配置放在properties文件中&#xff0c;启动的时候将工程中的properties/yaml文件的配置项加载到内存中。但这种方式改配置项的时候&#xff0c;需要重新编译部署&#xff0c;考虑到这种因素&#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; 蓝桥云课签约作者、已在蓝桥云…

问答机器人prompt

def build_prompt(prompt_template, **kwargs): ‘’‘将 Prompt 模板赋值’‘’ prompt prompt_template for k, v in kwargs.items(): if isinstance(v, str): val v elif isinstance(v, list) and all(isinstance(elem, str) for elem in v): val ‘\n’.join(v) else: v…

人机协同中的偏序关系

偏序关系是指集合中的元素之间存在一种有限的、非全序的关系。在该关系下&#xff0c;元素之间可以进行比较&#xff0c;但不一定能够确定它们的相对顺序。 在人机协同中&#xff0c;偏序关系可以用来描述人和机器之间的合作关系、信息传递关系或任务分配关系。例如&#xff0c…

数据库面经---10则

数据库范式有哪些&#xff1a;​​​​​​​ 第一范式&#xff08;1NF&#xff09;&#xff1a; 数据表中的每一列都是不可分割的原子值。每一行数据在关系表中都有唯一标识&#xff0c;通常是通过主键来实现。第二范式&#xff08;2NF&#xff09;&#xff1a; 满足第一范式。…

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

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

[论文笔记] PAI-Megatron中qwen和mistral合并到Megtron-LM

一、千问 关于tokenizer的改动: 1.1、更改build_tokenizer中tokenizer类的加载。 /mnt/nas/pretrain/code/Megatron-LM/megatron/tokenizer/__init__.py 或者 tokenizer.py 在build_tokenizer.py函数中: ​elif args.tokenizer_type == "QwenTokenizer":assert a…

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

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

Servlet-基本概念

一、概念 根据百度百科&#xff1a;Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称&#xff0c;是用Java编写的服务器端程序&#xff0c;主要功能在于交互式地浏览和生成数据&#xff0c;生成动态Web内容。 加深理解&#xff1a; 上面提到的Web内容我们…

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

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

【Java 设计模式】设计原则之迪米特法则

文章目录 1. 定义2. 好处3. 应用4. 示例结语 在软件开发中&#xff0c;设计原则是创建灵活、可维护和可扩展软件的基础。 这些原则为我们提供了指导方针&#xff0c;帮助我们构建高质量、易理解的代码。 ✨单一职责原则&#xff08;SRP&#xff09; ✨开放/封闭原则&#xff08…

新一代通信协议 - Socket.D

一、简介 Socket.D 是一种二进制字节流传输协议&#xff0c;位于 OSI 模型中的5~6层&#xff0c;底层可以依赖 TCP、UDP、KCP、WebSocket 等传输层协议。由 Noear 开发。支持异步流处理。其开发背后的动机是用开销更少的协议取代超文本传输协议(HTTP)&#xff0c;HTTP 协议对于…

环形链表[简单]

优质博文&#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导入 一…

Nacos_Linux上部署nacos

一. 准备工作 确保你的Linux服务器上已经安装了Java运行环境&#xff08;JRE&#xff09;&#xff0c;因为Nacos是基于Java开发的。下载Nacos的最新版本&#xff0c;你可以从Nacos的官方GitHub仓库下载。 选择合适的Linux服务器&#xff1a;确保你有一个运行稳定的Linux服务器…

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…