文章目录

  • 写在前边
  • SpringBoot 版本
  • Elasticsearch版本(7.6.2)
  • 需求说明
  • 实现步骤
  • 添加同义词组件
  • 项目中添加配置
    • 配置说明(来自于GitHub中项目说明(README.md))
    • 使用配置
    • 开发同步同义词接口
  • 在项目启动之后创建索引
  • 不完善的地方

写在前边

这是我做完之后整理出来的,如有遗漏或错误的地方,请在评论区指出,非常感谢!

假设你做该功能时,已经搭建好Spring data es的环境(elasticsearch和项目都已经搭建成功),es安装了analysis-ik分词器插件,请注意使用的版本号是否与我一致,我会将spring boot版本和es的版本放在下边

SpringBoot 版本

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.5.RELEASE</version><relativePath/> <!-- lookup parent from repository -->
</parent>

Elasticsearch版本(7.6.2)

{"name": "kms-1","cluster_name": "kms-application","cluster_uuid": "h766_yfYTv2wfy7bHsqIxw","version": {"number": "7.6.2","build_flavor": "default","build_type": "zip","build_hash": "ef48eb35cf30adf4db14086e8aabd07ef6fb113f","build_date": "2020-03-26T06:34:37.794943Z","build_snapshot": false,"lucene_version": "8.4.0","minimum_wire_compatibility_version": "6.8.0","minimum_index_compatibility_version": "6.0.0-beta1"},"tagline": "You Know, for Search"
}

需求说明

项目中有个需求是我在项目中维护同义词功能,操作之后需要同步到Es中去,比如添加一组同义词:番茄、西红柿; 那么这些应该同步到es中,并且生效。

实现步骤

在es中添加同义词组件 ===>>> 提供组件需要的接口(同步同义词) ===>>> 改变Spring data Es 创建索引的方式。

添加同义词组件

存放于GitHub中的该项目中有README.md,其中指出了同义词组件的打包安装方式,这里我就简单说下。
在github中将同义词组件(是一个java项目)下载,下载之后通过idea打开,更改pom.xml中版本号,改为es的版本号,比如我版本号是7.6.2,那么pom中的项目版本就改为7.6.2。如下所示:

修改完成之后等待maven更新完毕,在当前项目目录下执行mvn package,或者在idea中点击package打包,如下:

打包完毕之后将 target/releases 下的压缩包复制到es的plugins/dynamic-synonym目录下解压,具体目录如下:


重启es,至此同义词组件安装完毕。

项目中添加配置

  1. 在resources目录下创建一个目录 elasticsearch(名称不限)
  2. 在该目录中创建一个文件 settings.json(名称不限)

    settings.json内容如下:
{"index" : {"analysis" : {"analyzer" : {"synonym" : {"tokenizer" : "ik_max_word","filter" : ["remote_synonym"]}},"filter" : {"remote_synonym" : {"type" : "dynamic_synonym","synonyms_path" : "http://localhost:2000/kms/synonymWord/synchronizeSynonym","interval": 30},"local_synonym" : {"type" : "dynamic_synonym","synonyms_path" : "synonym.txt"},"synonym_graph" : {"type" : "dynamic_synonym_graph","synonyms_path" : "http://localhost:2000/kms/synonymWord/synchronizeSynonym"}}}}
}
配置说明(来自于GitHub中项目说明(README.md))

type:dynamic_synonym或dynamic_synonym_graph,必填

synonyms_path:相对于Elastic配置文件或URL的文件路径,必填

interval:刷新同义词文件的时间间隔(以秒为单位),默认值:60,可选

ignore_case:忽略同义词文件中的大小写,默认值:false,可选

expand:展开,默认:true,可选

lenient:导入同义词时抛出的异常例外,默认值:false,可选

format:同义词文件格式,默认值:’’,可选。对于WordNet结构,可以将其设置为’wordnet’

使用配置

完成之后再需要使用同义词的地方通过@Setting(settingPath = “elasticsearch/settings.json”) 引入

字段中指定分词器是需使用settings中指定的分词器 synonym。完整java类文件如下:

package com.focustar.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
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.Setting;import java.io.Serializable;/*** <p>* 知识附件对象* </p>** @author 天玺* @since 2020-11-18*/
@Data
@EqualsAndHashCode(callSuper = false)
@Setting(settingPath = "elasticsearch/settings.json")
@Document(createIndex = false, indexName = "kms_attachment")
public class TKmsAttachment implements Serializable {private static final long serialVersionUID = 1L;@Id@TableId(value = "PID", type = IdType.AUTO)private Long pid;@TableField("Title")@Field(searchAnalyzer = "synonym", type = FieldType.Text, analyzer = "synonym")private String title;private String content;}

注意:
Document注解中的createIndex 被我设置成false了,不要让他自动创建
title字段上的Field注解,指定的分词器就是settings.json中指定的。

开发同步同义词接口

示例如下:

@GetMapping("/synchronizeSynonym")
public String synchronizeSynonym() {log.info("开始同步数据库同义词...");HttpServletRequest request = SpringContextUtils.getCurrentRequest();String eTag = request.getHeader("If-None-Match");String modified = request.getHeader("If-Modified-Since");SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String currentDate = sdf.format(new Date());StringBuilder synonymStr = new StringBuilder();if (!Objects.equals(currentDate, modified)) {int count = itKmsSynonymwordService.count();if (!Objects.equals(count + "", eTag)) {// 获取所有同义词List<TKmsSynonymword> synonymWords = itKmsSynonymwordService.list();// 根据同义词组分组Map<Long, List<TKmsSynonymword>> synonymWordGroup = synonymWords.stream().collect(Collectors.groupingBy(TKmsSynonymword::getSynGroupPid));for (Map.Entry<Long, List<TKmsSynonymword>> longListEntry : synonymWordGroup.entrySet()) {// map的key是组ID,value集合对应的就是该组所有同义词for (TKmsSynonymword tKmsSynonymword : longListEntry.getValue()) {// 遍历,以 “,” 分割synonymStr.append(tKmsSynonymword.getSynWord()).append(",");}if (synonymStr.length() > 0) {synonymStr.deleteCharAt(synonymStr.length() - 1);synonymStr.append("\n");}}eTag = count + "";modified = currentDate;} else {log.info("同义词未更新,不需同步...");}}HttpServletResponse response = SpringContextUtils.getCurrentResponse();//更新时间response.setHeader("Last-Modified", modified);response.setHeader("ETag", eTag);response.setHeader("Content-Type", "text/plain");return synonymStr.toString();
}

返回格式:

番茄,西红柿
奔驰,大奔

之后再settings.json中指定该接口

我settings.json中指定的url是:

http://localhost:2000/kms/synonymWord/synchronizeSynonym

es启动时会加载同义词组件,同义词组件根据这个来获取同义词;这个路径是相对于es来说的,es和项目都是在我本地;

在项目启动之后创建索引

package com.focustar.runner;import com.focustar.entity.custom.TKmsAttachmentCustom;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.IndexOperations;
import org.springframework.data.elasticsearch.core.document.Document;
import org.springframework.data.elasticsearch.core.index.MappingBuilder;
import org.springframework.stereotype.Component;/*** 项目启动后调用** @author vains* @date 2021/2/16 16:57*/
@Slf4j
@Component
@AllArgsConstructor
public class StartedRunner implements ApplicationRunner {private final ElasticsearchOperations elasticsearchOperations;@Overridepublic void run(ApplicationArguments args) {// 初始化TKmsAttachmentCustom在es中的索引initAttachmentIndex();}/*** 在这里创建索引是因为es添加了同义词插件,同义词插件会通过本项目的接口去获取对应的同义词,* 如果让Spring data es自动创建,那么项目控制器尚未加载成功,这时插件无法获取同义词(请求接口404),* 那么es 就无法加载同义词插件,如果项目启动成功之后再去创建索引就不会出现上述问题。*/private void initAttachmentIndex() {log.info("开始创建索引...");IndexOperations indexOperations = elasticsearchOperations.indexOps(TKmsAttachment.class);MappingBuilder builder = new MappingBuilder(elasticsearchOperations.getElasticsearchConverter());String mapping = builder.buildPropertyMapping(TKmsAttachment.class);Document document = Document.parse(mapping);try {if (indexOperations.exists()) {indexOperations.delete();log.info("索引已经存在,重新创建。");}indexOperations.create();indexOperations.putMapping(document);log.info("索引创建成功...");} catch (Exception e) {log.error("索引创建失败.原因:", e);}}}

至此,同义词组件整合完毕。

不完善的地方

目前是手动创建的索引(原因在上边的代码中),创建索引映射时只会创建含有Field注解的字段,比如上边的实体类上边,只有title会创建映射,而content字段不会创建。如果大佬们有更好的解决方案,请在评论区说明,非常感谢!

Spring data elasticsearch添加同义词组件实现同义词热更新相关推荐

  1. Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十四(Spring Data Elasticsearch,将数据添加到索引库)

    Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十四(Spring Data Elasticsearch,将数据添加到索引库) 一.创建El ...

  2. Lucene 和 Kibana、ElasticSeach、Spring Data ElasticSearch

    什么是全文检索 数据分类 生活中的数据总体分为两种:结构化数据和非结构化数据. 结构化数据 - 行数据,可以用二维表结构来逻辑表达实现的数据:指具有固定格式或有限长度的数据,如数据库,元数据等. 非结 ...

  3. Spring Data ElasticSearch入门案例

    Spring Data ElasticSearch入门案例 创建maven工程elasticsearch_springdata 基于maven导入坐标 导入spring data elasticsea ...

  4. Spring Data Elasticsearch案例详解

    一.Elasticsearch 工作原理 1.1 文档存储的路由 当索引到一个文档(如:报价系统),具体的文档数据(如:报价数据)会存储到一个分片.具体文档数据会被切分,并分别存储在分片 1 或者 分 ...

  5. Spring Boot + Spring Data + Elasticsearch实例

    在本文中,我们将讨论"如何创建Spring Boot + Spring Data + Elasticsearch范例". 本文中使用的工具: Spring Boot 1.5.1.R ...

  6. Elasticsearch 实战1:ES 项目实战(一)Java 集成 Spring Data Elasticsearch(一):简介及环境搭建

    一:前语 1.项目文档 CSDN 专栏:<Elasticsearch 入门和项目实战> 博客路径: https://blog.csdn.net/a767815662/category_91 ...

  7. 【Spring Data ElasticSearch】高级查询,聚合

    [Spring Data ElasticSearch]高级查询,聚合 1. 高级查询 1.1 基本查询 1.2 自定义查询 1.3 分页查询 1.4 排序 2. 聚合 2.1 聚合为桶 2.2 嵌套聚 ...

  8. Spring Data Elasticsearch 和 x-pack 用户名/密码验证连接

    为什么80%的码农都做不了架构师?>>>    使用Spring Data Elasticsearch连接elasticsearch时,正常情况下只需要在application.pr ...

  9. es拼音分词 大帅哥_elasticsearch 拼音+ik分词,spring data elasticsearch 拼音分词

    elasticsearch 自定义分词器 安装拼音分词器.ik分词器 下载源码需要使用maven打包 下载构建好的压缩包解压后放直接在elasticsearch安装目录下 plugins文件夹下,可以 ...

  10. Spring Data ElasticSearch增删改查

    Spring Data ElasticSearch 一.介绍 ElasticSearch 学习路线图 1.学习ElasticSearch安装及其API操作 2. 学习原生ElastricSearch ...

最新文章

  1. 英伟达TensorRT 8-bit Inference推理
  2. 乐源机器人没电提醒吗_我每天费尽心思,就为了逗一个机器人开心。。
  3. floatingactionbutton 更改背景颜色_经验分享!Word轻松换掉证件照背景颜色
  4. 安装Typora情况下,Windows右键新建菜单中增加新建md文件
  5. 二叉树的建立以及先序、中序、后序遍历C语言实现---【递归方式】
  6. PPT如何让多对象排列整齐
  7. Android之基于xmpp openfire smack开发之Android消息推送技术原理分析和实践[4]
  8. Nexus搭建Maven私有仓库
  9. SWF反编译软件Action Script Viewer ASV2011/06发布
  10. CF刷刷水题找自信 2
  11. java wsdl反向生成源码,并使用CXF实现客户端调用代码
  12. 纠删码(Erasure Code)及其演进LRC(Locally Repairable Codes)原理讲解
  13. word里的图片用计算机画图,word绘图教程:图形工具介绍和使用方法-word技巧-电脑技巧收藏家...
  14. 简单图(simple graph)原理及实现(Java)
  15. 【Python】如何用pyth做游戏脚本(太简单了吧)
  16. 使用PHP实现蜘蛛访问日志统计
  17. java编译后的扩展名,Java源程序的扩展名是( ),经过编译后的程序的扩展名是( )...
  18. 谁在用琵琶弹奏一曲东风破
  19. Meth | 关闭mac自带apache的启动
  20. 操作系统实验三·xv6系统增添系统调用和用户级应用程序

热门文章

  1. html5橡皮擦,HTML5 Canvas笔记——实现橡皮擦功能,包括矩形擦和圆形擦。
  2. Oracle 通过出生日期计算年龄
  3. 魅族计算机软件不见了,任务栏不见了
  4. 2023年上半年信息系统项目管理师考试时间你知道吗?
  5. 异常与调试之SEH、UEH、VEH、VCH以及SEH原理
  6. 阿里云对象存储上传或复制文件时报The request signature we calculated does not match the signature you provided...
  7. Ubuntu 压缩多个vmdk文件
  8. 三大控制结构 js函数定义
  9. python 发邮件 抄送,Python调用outlook发送邮件,发送给多人、抄送给多人并带上附件...
  10. PHP祝福语,日常祝福语