当前位置: 首页 > article >正文

es自定义ik分词器中文词库实现热更新

        基于web地址的方式实现ik分词热更新。

操作系统:win 11

es version:8.6.2

ik version:8.6.2


1、创建web服务,并提供ik查询词库接口

  • 编写分词http url代码,返回自定义分词内容
  • 分词词库数据来自业务需求,存储于业务DB,便于维护
  • 多个分词按行输出,中文分词编码UTF-8
  • http url接口返回内容编码UTF-8
  • 设置返回header头信息 ETag 为自定义词库的hash值;
  • 设置返回header头信息 Last-Modified 为自定义词库最新更新的时间

ETag和Last-Modified任意一个变化就会ik就会更新词库。

package com.david.ikremotedict.controller;import com.david.ikremotedict.domain.IkExtDict;
import com.david.ikremotedict.domain.IkStopDict;
import com.david.ikremotedict.service.IkExtDictService;
import com.david.ikremotedict.service.IkStopDictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.List;/*** @authar David* @Date 2025/4/1* @description*/
@Controller
@RequestMapping("/remoteDict")
public class RemoteDictController {//自定义分词词库@Autowiredprivate IkExtDictService extDictService;@Autowiredprivate IkStopDictService stopDictService;private final String DEFAULT_LAST_MODIFIED = "1743492903";/*** 扩展分词** @return *  @throws IOException*/@GetMapping(value = "extDict")@ResponseBodypublic ResponseEntity<StreamingResponseBody> ikExtDict() throws IOException {System.out.println(LocalDateTime.now());// 获取词库列表List<IkExtDict> list = extDictService.list();// 提前判断 list 是否为空,避免不必要的流式处理if (list == null || list.isEmpty()) {return ResponseEntity.noContent().header("ETag", "eb5b427b4d494525a6595a215df46dab").header("Last-Modified", DEFAULT_LAST_MODIFIED).build();}// 获取最新的创建时间戳IkExtDict latestDict = list.get(list.size() - 1);long timestamp = latestDict.getCreatedAt().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();// 创建流式响应体StreamingResponseBody responseBody = outputStream -> {try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))) {for (IkExtDict dict : list) {writer.write(dict.getDict());writer.newLine(); // 写入换行符}} catch (IOException exception) {exception.printStackTrace(); // 抛出异常以便上层处理}};// 返回响应实体return ResponseEntity.ok().contentType(MediaType.valueOf("text/plain;charset=UTF-8")).header("ETag", "eb5b427b4d494525a6595a215df46dab")// 这里应该返回操作dict的最后时间,先临时返回最后一个数据的创建时间.header("Last-Modified", String.valueOf(timestamp)).body(responseBody);}/*** 扩展停止词** @return *  @throws IOException*/@GetMapping(value = "stopDict")@ResponseBodypublic ResponseEntity<StreamingResponseBody> ikStopDict() throws IOException {List<IkStopDict> list = stopDictService.list();// 提前判断 list 是否为空,避免不必要的流式处理if (list == null || list.isEmpty()) {return ResponseEntity.noContent().header("ETag", "eb5b427b4d494525a6595a215df46dab").header("Last-Modified", DEFAULT_LAST_MODIFIED).build();}// 获取最新的创建时间戳IkStopDict latestDict = list.get(list.size() - 1);long timestamp = latestDict.getCreatedAt().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();// 创建流式响应体StreamingResponseBody responseBody = outputStream -> {try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))) {for (IkStopDict dict : list) {writer.write(dict.getDict());writer.newLine(); // 写入换行符}} catch (IOException exception) {exception.printStackTrace(); // 抛出异常以便上层处理}};// 返回响应实体return ResponseEntity.ok().contentType(MediaType.valueOf("text/plain;charset=UTF-8")).header("ETag", "5a6595a2eb5b427b4d4945215df46dab")// 这里应该返回操作dict的最后时间,先临时返回最后一个数据的创建时间.header("Last-Modified", String.valueOf(timestamp)).body(responseBody);}
}

        源码地址 github:https://github.com/a66245753/ik-remote-dict.git

        查询扩展词url:http://127.0.0.1:8080/remoteDict/extDict

        查询停用词url:http://127.0.0.1:8080/remoteDict/stopDict 

     

2、ik 插件下载配置

        2.1、下载ik分词器地址:Index of:

        2.2、进入analysis-ik

        2.3、选择es对应版本 8.6.2 

        下载地址:https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.6.2.zip

         2.4、在es插件目录下新建ik目录,{es-path}\plugins\ik

         2.5、将2.3下载的压缩包解压到ik目录

          2.6、在es的config下面创建analysis-ik目录,{es-path}\config\analysis-ik

          2.7、将ik目录下config里面的文件拷贝到analysis-ik目录中

           2.8、编辑 IKAnalyzer.cfg.xml,将web服务中的数据接口地址填进去

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict"></entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords"></entry><!-- 用户可以在这里配置远程扩展字典  --><entry key="remote_ext_dict">http://127.0.0.1:8080/remoteDict/extDict</entry><!-- 用户可以在这里配置远程扩展停止词字典 --><entry key="remote_ext_stopwords">http://127.0.0.1:8080/remoteDict/stopDict</entry>
</properties>

3、启动es和kibana

        启动es的时候会看到加载plugin的日志和词库内容。

4、验证 

        4.1、没加“噜咪啦”分词前的解析

        4.2、加“噜咪啦”分词后的解析 

 经过测试ik读取web地址的频率是每分钟一次,暂时没找到强制刷新的方法。

索引字段与属性都属于静态设置,若后期变更历史数据需要重建索引才可生效
对历史数据无效!!!!一定要重建索引!!!!

重建索引:es 3期 第10节 如何正确使用Reindex重建索引_es reindex 原索更新正常使用-CSDN博客

配置文件含义:

IKAnalyzer.cfg.xml:配置自定义词库文件

main.dic:内置的中文词库

quantifier.dic:单位相关的词

suffix.dic:后缀词

surname.dic:中国姓氏

stopword.dic:英文停用词

preposition.dic:介词词典

相关文章:

es自定义ik分词器中文词库实现热更新

基于web地址的方式实现ik分词热更新。 操作系统&#xff1a;win 11 es version&#xff1a;8.6.2 ik version&#xff1a;8.6.2 1、创建web服务&#xff0c;并提供ik查询词库接口 编写分词http url代码&#xff0c;返回自定义分词内容分词词库数据来自业务需求&#xff0c;存…...

OpenStack 卷虚拟机跨租户迁移方案

目标&#xff1a;迁移租户A的卷虚机到租户B 场景&#xff1a;使用卷虚拟机&#xff0c;租户a和b使用相同网络 租户A的操作&#xff1a; 1.记录虚拟机的ip地址&#xff0c;Mac信息&#xff0c; nova interface-list neutron port-show 2.对虚拟机进行关机操作&#xff0c;将…...

添加购物车功能

业务需求&#xff1a; 用户提交三个字段&#xff0c;服务端根据提交的字段判断是菜品还是套餐&#xff0c;根据菜品或者套餐添加购物车表中。 代码实现 RestController Slf4j RequestMapping("/user/shoppingCart") public class ShoppingCartController {Autowired…...

Logo语言的系统监控

Logo语言的系统监控 引言 在信息技术飞速发展的时代&#xff0c;系统监控成为了确保计算机系统和网络平稳运行的重要手段。系统监控不仅可以实时跟踪系统的性能、资源使用情况和安全风险等&#xff0c;还能够在出现问题时及时发出警报&#xff0c;从而避免潜在的故障和损失。…...

Scheme语言的算法

Scheme语言的算法探索 引言 Scheme是一种以表达式为基础的编程语言&#xff0c;属于Lisp家族&#xff0c;因其简洁、灵活的语法而受到广泛关注。Scheme不仅适合教学&#xff0c;还被用于实际应用开发和研究。本文将深入探讨Scheme语言的算法&#xff0c;包括其基本特性、常用…...

Python爬虫第2节-网页基础和爬虫基本原理

目录 一、网页基础 1.1 网页的组成 1.2 网页的结构 1.3 节点树及节点间的关系 1.4 选择器 二、爬虫的基本原理 2.1 爬虫概述 2.2 能抓怎样的数据 2.3 JavaScript 渲染页面 一、网页基础 使用浏览器访问网站时&#xff0c;我们会看到各式各样的页面。你是否思考过&…...

阿里巴巴langengine二次开发大模型平台

阿里巴巴LangEngine开源了&#xff01;支撑亿级网关规模的高可用Java原生AI应用开发框架 - Leepy - 博客园 阿里国际AI应用搭建平台建设之路(上) - 框架篇 基于java二次开发 目前Spring ai、spring ai alibaba 都是java版本的二次基础能力 重要的是前端工作流 如何与 服务端的…...

深度学习中的 Batch 机制:从理论到实践的全方位解析

一、Batch 的起源与核心概念 1.1 批量的中文译名解析 Batch 在深度学习领域标准翻译为"批量"或"批次"&#xff0c;指代一次性输入神经网络进行处理的样本集合。这一概念源自统计学中的批量处理思想&#xff0c;在计算机视觉先驱者Yann LeCun于1989年提出…...

【网络协议】三次握手与四次挥手

例如我们使用MobaXterm登录服务器的时候&#xff0c;基于TCP协议的之间是如何进行通信的&#xff1f; 使用工具&#xff1a;wireshark抓取传输层TCP协议 三次握手 mobaxterm&#xff1a;登录服务器触发三次握手 wireshark过滤分析 ip.addr 192.168.3.239 192.168.3.239登录…...

请求被中止: 未能创建 SSL/TLS 安全通道。

需要安装vs2019社区办&#xff0c;下载VisualStudioSetup.exe后&#xff0c;报无法从"https://aka,ms/vs/16/release/channel"下载通道清单错误&#xff0c;接着打开%temp%目录下的最新日志&#xff0c;发现日志里报&#xff1a; [27d4:000f][2025-04-04T21:15:43] …...

JS API

const变量优先 即对象、数组等引用类型数据可以用const声明 API作用和分类 DOM (ducument object model) 操作网页内容即HTML标签的 树状模型 HTML中标签 JS中对象 最大对象 document 其次大 html 以此类推 获取DOM对象 CSS 中 使用选择器 JS 中 选多个 时代的眼泪 修…...

“一路有你”公益行携手《东方星动》走进湖南岳阳岑川镇中心小学

2025年4月2日&#xff0c;“一路有你”公益行携手《东方星动》走进湖南岳阳岑川镇&#xff0c;一场充满爱与温暖的捐赠仪式在岑川镇中心小学隆重举行。这是一场跨越千里的爱心捐赠&#xff0c;也是一场别开生面的国防教育&#xff0c;更是一场赋能提质的文化盛宴。 岑川镇地处湘…...

vue组件开发:什么是VUE组件?

什么是VUE组件 在我们实际开发过程中你也许会发现有很多代码是重复的&#xff0c;它们可能是一个按钮、一个表单、一个列表等等&#xff0c;其中最为显著的应该是列表。 以CSDN的首页为例&#xff1a; 上述截图中的文章列表可能会在多处出现&#xff0c;比如此截图是精选博客…...

仿小红书社交源码+及时通讯聊天软件APP源码

多端支持&#xff0c;数据互通 本程序支持H5、小程序、安卓、iOS四端运行&#xff0c;共用同一套后台管理系统&#xff0c;确保数据同步&#xff0c;用户可在不同设备上无缝切换&#xff0c;实现真正的多端互通。 技术架构 前端技术&#xff1a;Vue2、uni-app、HTML、CSS、Jav…...

Libevent TCP开发指南

一、概念 Libevent 提供了高效的 TCP 网络编程接口,使开发者能够轻松构建高性能的 TCP 服务器和客户端。本指南将详细介绍如何使用 Libevent 进行 TCP 网络开发。 核心组件 事件基 (event_base) - 事件处理的核心结构 事件 (event) - 表示单个事件 缓冲区事件 (bufferevent)…...

Objective-C语言的集合

Objective-C语言的集合 引言 Objective-C是一种面向对象的编程语言&#xff0c;主要用于苹果的macOS和iOS系统应用程序的开发。作为C语言的一个超集&#xff0c;Objective-C继承了C语言的优雅&#xff0c;同时又添加了许多强大的特性&#xff0c;使其适合于大型项目的开发。在…...

网络安全与防护策略

随着互联网的普及与信息化程度的不断加深&#xff0c;网络安全问题已成为全球关注的焦点。从个人用户到大规模的企业系统&#xff0c;网络安全威胁的不断演变和升级已成为每个人和组织不可忽视的挑战。无论是恶意软件、钓鱼攻击&#xff0c;还是数据泄露、拒绝服务攻击&#xf…...

OpenCV:计算机视觉的强大开源库

文章目录 引言一、什么是OpenCV&#xff1f;1.OpenCV的核心特点 二、OpenCV的主要功能模块1. 核心功能&#xff08;Core Functionality&#xff09;2. 图像处理&#xff08;Image Processing&#xff09;3. 特征检测与描述&#xff08;Features2D&#xff09;4. 目标检测&#…...

Java基础:面向对象进阶(二)

01-static static修饰成员方法 static注意事项&#xff08;3种&#xff09; static应用知识&#xff1a;代码块 static应用知识&#xff1a;单列模式 02-面向对象三大特征之二&#xff1a;继承 什么是继承&#xff1f; 使用继承有啥好处? 权限修饰符 单继承、Object类 方法重…...

【MVP 和 MVVM 相比 MVC 有哪些优化点?】

MVP 和 MVVM 相比 MVC 的优化及原因 1. MVC 的痛点 在传统 MVC 模式中&#xff1a; 视图&#xff08;View&#xff09;和模型&#xff08;Model&#xff09;直接交互&#xff1a;View 可能直接监听 Model 的变化&#xff08;如观察者模式&#xff09;&#xff0c;导致耦合。…...

ttkbootstrap 实现日期选择器, 开始和结束时间

ttkbootstrap 实现日期选择器&#xff0c; 开始和结束时间 1. 展示 2. 打印 3. 源码 from datetime import datetime import ttkbootstrap as ttkclass DateTimeEntryStart(ttk.Frame):def __init__(self, masterNone, **kwargs):super().__init__(master, **kwargs)self.dat…...

Vulnhub-PrinkysPalacev3

Vulnhub-PrinkysPalacev3 1、主机发现 arp-scan -l 扫描同网段 2、端口扫描 nmap -sS -sV 192.168.66.185 nmap -sS -A -T4 -p- 192.168.66.185 nmap --scriptvuln 192.168.66.185 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or later 5555/tcp o…...

matlab从pytorch中导入LeNet-5网络框架

文章目录 一、Pytorch的LeNet-5网络准备二、保存用于导入matlab的model三、导入matlab四、用matlab训练这个导入的网络 这里演示从pytorch的LeNet-5网络导入到matlab中进行训练用。 一、Pytorch的LeNet-5网络准备 根据LeNet-5的结构图&#xff0c;我们可以写如下结构 import…...

淘宝商品数据爬取与分析

淘宝商品数据爬取与分析是一个涉及网络爬虫技术和数据分析方法的过程&#xff0c;以下是其主要步骤&#xff1a; 数据爬取 确定爬取目标&#xff1a;明确要爬取的淘宝商品类别、具体商品名称或关键词等&#xff0c;例如想要分析智能手机市场&#xff0c;就以 “智能手机” 为…...

Spring Boot向Vue发送消息通过WebSocket实现通信

注意&#xff1a;如果后端有contextPath&#xff0c;如/app&#xff0c;那么前端访问的url就是ip:port/app/ws 后端实现步骤 添加Spring Boot WebSocket依赖配置WebSocket端点和消息代理创建控制器&#xff0c;使用SimpMessagingTemplate发送消息 前端实现步骤 安装sockjs-…...

Django4.0的快速查询以及分页

1. filter 方法 filter 是 Django ORM 中最常用的查询方法之一。它用来根据给定的条件过滤查询集并返回满足条件的对象。 articles Article.objects.all() # 使用 SearchFilter 进行搜索 search_param request.query_params.get(search, None) author_id request.query_pa…...

LangChain/Eliza框架在使用场景上的异同,Eliza通过配置实现功能扩展的例子

LangChain与Eliza框架的异同分析 ‌一、相同点‌ ‌模块化架构设计‌ 两者均采用模块化设计&#xff0c;支持灵活扩展和功能组合。LangChain通过Chains、Agents等组件实现多步骤任务编排‌&#xff0c;Eliza通过插件系统和信任引擎实现智能体功能的动态扩展‌。模块化特性降低…...

用spring-webmvc包实现AI(Deepseek)事件流(SSE)推送

前后端&#xff1a; Spring Boot Angular spring-webmvc-5.2.2包 代码片段如下&#xff1a; 控制层&#xff1a; GetMapping(value "/realtime/page/ai/sse", produces MediaType.TEXT_EVENT_STREAM_VALUE)ApiOperation(value "获取告警记录进行AI分析…...

MusicMint ,AI音乐生成工具

MusicMint是什么 MusicMint 是一款强大的人工智能音乐创作工具&#xff0c;旨在帮助用户轻松制作个性化的音乐作品。借助先进的 AI 技术&#xff0c;用户只需输入简短的描述或选择心仪的音乐风格&#xff0c;便能迅速生成独特的歌曲。该平台支持多种音乐风格&#xff0c;包括流…...

嵌入式学习笔记——SPI协议

SPI协议详解 SPI协议概述SPI接口信号介绍SPI通信模式SPI的通信流程SPI的优缺点优点缺点 SPI在STM32上的实现SPI引脚配置SPI初始化代码&#xff08;STM32F10x&#xff09;SPI主设备发送和接收数据SPI从设备数据处理 总结 SPI协议概述 SPI&#xff08;Serial Peripheral Interfa…...