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:介詞詞典

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75459.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75459.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鉑卡梭 智能羽翼 AI 系統:交易科技的未來引擎

突破性的 AI 交易系統 鉑卡梭(Pegasus)近期推出的 InnoFeather AI System(智能羽翼 AI 系統) 代表了金融科技領域的前沿突破。這一系統集成了先進的 機器學習算法、大數據分析 和 實時市場情緒感知,旨在幫助交易者在復雜多變的市場環境中做出更精準的決策。 智能羽翼 AI 系統的…

js中判斷對象是否包含某個屬性(元素)

在JavaScript中&#xff0c;判斷對象是否包含某個屬性&#xff08;元素&#xff09;主要有以下幾種方法&#xff0c;根據具體需求選擇合適的方式&#xff1a; 1. 使用 in 運算符 作用&#xff1a;檢查對象自身及原型鏈上是否存在指定屬性。 示例&#xff1a; javascript cons…

Anaconda和Pycharm的區別,以及如何選擇兩者

目錄 主要區別詳細說明如何選擇&#xff1f;Anaconda的使用步驟 主要區別 Anaconda 和 PyCharm 是 Python 開發中常用的兩個工具&#xff0c;但它們的定位和功能完全不同。以下是它們的主要區別&#xff1a; 對比項AnacondaPyCharm類型Python 發行版 包管理工具Python 集成開…

UE小:在Unreal Engine 5中實現多層靜態網格體遮擋拾取

問題描述 當需要拾取被多層靜態網格體遮擋的對象時&#xff0c;若所有網格體碰撞預設為BlockAll&#xff0c;需要通過特殊配置實現穿透檢測。 完整實現方案 1. 創建自定義追蹤通道 進入 ?項目設置&#xff08;Project Settings&#xff09; > 碰撞&#xff08;Collision…

wireshark抓包分析數據怎么看 wireshark使用教程_wireshark怎么看

Wireshark與Sniff Master&#xff1a;網絡抓包工具使用指南 網絡抓包分析是開發測試和網絡故障排查中不可或缺的技能。在眾多抓包工具中&#xff0c;Wireshark無疑是最流行且功能強大的選擇&#xff0c;而Sniff Master作為后起之秀&#xff0c;也因其簡潔高效的特點受到許多專…

密碼學基礎——古典密碼學

目錄 一、定義 特點&#xff1a; 二、發展階段 三、代換密碼 1.單表代換密碼 1.1愷撒密碼 1.2 移位變換 1.3 仿射變換 2.多表代換密碼 維吉尼亞密碼 四、置換密碼 柵欄密碼 一、定義 古典密碼學是指在現代密碼學出現之前&#xff0c;使用較為簡單的數學方法和手工…

【案例分享】江蘇某汽車制造廠水冷式制冷站AI節能優化方案

主要訴求&#xff1a; 對B系統進行AI節能優化&#xff1a;3臺離心機1臺螺桿機板式換熱器 優化前后對比&#xff1a; ? 優化前&#xff1a;根據人工經驗判斷冷機和板換的啟停&#xff0c;PLC固定邏輯調節參數 ?優化后&#xff1a;根據冷負荷對工況進行分類&#xff0c;自動…

vue+springboot 新增操作,前端id傳string,后端接收為long類型,報錯類型不匹配——解決方法

我在做新增功能的時候&#xff0c;做了一個邏輯判斷&#xff0c;當前端沒有傳遞對應的id值時&#xff0c;為新增&#xff1b;有id值時&#xff0c;為修改 問題一、&#xff1a;前端idundefined&#xff0c;和我的需求不符合&#xff0c;我要id為空&#xff0c;不傳值。最后發現…

vue前端項目技術架構(第二版)

vue技術架構介紹 如下圖所示&#xff0c;展示了項目系統的軟件層次架構。該系統采用基于SOA&#xff08;面向服務架構&#xff09;思想的分層架構&#xff0c;分為四個主要層次&#xff1a;視圖層、編譯層、代碼層和數據層。 視圖層 瀏覽器&#xff1a;核心職責是解析并展示…

在服務器里面磁盤分區很簡單嗎?

不管是我們的普通辦公電腦還是服務器都是需要硬盤的&#xff0c;硬盤的類型分機械硬盤&#xff08;HDD&#xff09;和固態硬盤&#xff08;SSD&#xff09;&#xff0c;這兩種磁盤是我們平常最常見的硬盤您他們又有什么區別 機械硬盤&#xff08;HDD&#xff09; 原理&#xff…

Pycharm(十一):字符串練習題

1.輸入一個字符串&#xff0c;打印所有偶數位上的字符(下標是0&#xff0c;2&#xff0c;4&#xff0c;6...位上的字符) # 練習題1:輸入一個字符串&#xff0c;打印所有偶數位上的字符(下標是0&#xff0c;2&#xff0c;4&#xff0c;6...位上的字符) # 1.鍵盤錄入字符串&…

虛幻5入門

常用操作 運行時&#xff0c;調試相機&#xff0c;按~鍵&#xff0c;輸入ToggleDebugCamera 。進入自由視角 常用節點 gate節點&#xff1a;用于控制該流程通不通&#xff0c;執不執行。Flip Flop節點&#xff1a;反轉執行&#xff0c;一次A&#xff0c;一次B。Set Timer by…

Prompt Flow 與 DSPy:大型語言模型開發的未來

作為一名大模型算法工程師&#xff0c;我一直在探索如何更高效地開發和優化基于大型語言模型&#xff08;LLM&#xff09;的應用程序。隨著模型規模的不斷擴大和應用場景的日益復雜&#xff0c;傳統的開發方式已經難以滿足高效、靈活和可擴展的需求。幸運的是&#xff0c;Promp…

Prompt攻擊是什么

什么是Prompt攻擊 Prompt攻擊(Prompt Injection/Attack) 是指通過精心構造的輸入提示(Prompt),誘導大語言模型(LLM)突破預設安全限制、泄露敏感信息或執行惡意操作的攻擊行為。其本質是利用模型對自然語言的理解漏洞,通過語義欺騙繞過防護機制。 Prompt攻擊的精髓:學…

Python 數據類型 - 集合(set)

Python 數據類型 - 集合(set) 1. 集合簡介 集合(set)是Python中的一種無序、可變、不重復元素的容器數據類型。集合的主要用途&#xff1a; 快速成員檢測&#xff08;判斷元素是否存在&#xff09;去除重復項執行數學集合運算&#xff08;并集、交集、差集等&#xff09; 2.…

Profibus DP主站轉Modbus TCP網關配置文件制作

Profibus DP主站轉Modbus TCP網關配置文件制作 1、首先打開配置文件制作軟件SST Profibus Configuration&#xff1a; 2、點擊“Library”選擇GSD文件所在文件夾找到后點擊打開導入GSD文件: 3、點開Masters、molex選擇主站設備&#xff1a; 4、雙擊添加后地址保存默認0就可以&…

如何批量拆分Excel工作表或按行拆分Excel表格 - Excel拆分器使用方法

在數據分析和處理的日常工作中&#xff0c;Excel文件因其強大的數據管理和計算能力而廣受歡迎。然而&#xff0c;當面對龐大的Excel工作簿&#xff0c;特別是需要將其拆分為多個獨立文件時&#xff0c;傳統的操作方法往往會顯得繁瑣且效率低下。為了解決這一難題&#xff0c;Ex…

JavaScript基礎-移動端常見特效

隨著移動互聯網的發展&#xff0c;為移動設備優化的網頁變得越來越重要。JavaScript在實現移動端特有的交互體驗中扮演著關鍵角色。本文將介紹幾種常見的移動端特效&#xff0c;并通過具體的代碼示例展示如何使用JavaScript和相關技術來創建這些特效。 一、手勢識別 &#xf…

ui-tars和omni-parser使用

ui-tars部署和訓練 說明快速開始環境準備ui-tars web推理和訓練ui-tars api部署omni-parser使用 說明 鏡像中包含ui-tars、llama-factory和omni-parser。該鏡像還在審批中&#xff0c;估計明天可以上線&#xff0c;到時候可以在auto-dl中的社區鏡像搜索。 快速開始 使用auto…

TF-IDF——自然語言處理——紅樓夢案例

目錄 一、紅樓夢數據分析 &#xff08;1&#xff09;紅樓夢源文件 &#xff08;2&#xff09;數據預處理——分卷實現思路 &#xff08;3&#xff09;分卷代碼 二、分卷處理&#xff0c;刪除停用詞&#xff0c;將文章轉換為標準格式 1.實現的思路及細節 2.代碼實現&#…