ES常識9:如何實現同義詞映射(搜索)

在 Elasticsearch(ES)中實現同義詞映射(如“美麗”和“漂亮”),核心是通過 同義詞過濾器(Synonym Token Filter) 在分詞階段將同義詞擴展或替換為統一詞項,從而讓搜索時輸入任意一個同義詞都能匹配到所有相關文檔。以下是分步驟的實現方案,結合 ES8 的特性說明:

一、同義詞處理的核心原理

ES 的同義詞處理發生在 分詞(Analysis)階段,通過自定義分析器(Analyzer)中的 同義詞過濾器 將輸入的文本(無論是索引文檔還是搜索詞)中的同義詞替換或擴展為統一詞項。例如:

  • 索引文檔時,若文檔包含“美麗”,會被擴展為“美麗 漂亮”;
  • 搜索時輸入“漂亮”,也會被擴展為“美麗 漂亮”,從而匹配到所有包含“美麗”或“漂亮”的文檔。

二、同義詞配置的關鍵步驟

1. 定義同義詞規則

同義詞規則需按 ES 支持的語法編寫,常見格式為:

美麗, 漂亮 => 美麗  // 替換模式:將“美麗”和“漂亮”替換為“美麗”(保留一個詞項)
# 或
美麗, 漂亮          // 擴展模式:將“美麗”或“漂亮”擴展為“美麗 漂亮”(保留所有詞項)
  • => 符號表示替換(僅保留右側詞項);無符號表示擴展(保留所有詞項)。
  • # 為注釋行。
2. 創建包含同義詞過濾器的自定義分析器

在 ES 中,需將同義詞過濾器綁定到自定義分析器,并指定該分析器用于目標字段的索引和查詢。

示例(通過 ES API 創建索引并配置分析器)

PUT /my_index
{"settings": {"analysis": {"filter": {"my_synonym_filter": {"type": "synonym",          // 同義詞過濾器類型"synonyms_path": "synonyms.txt",  // 同義詞文件路徑(支持本地文件或遠程 URL)"expand": true,             // 是否擴展同義詞(默認 true)"lenient": true             // 忽略解析錯誤(如無效規則)}},"analyzer": {"my_synonym_analyzer": {"tokenizer": "standard",    // 基礎分詞器(如 standard、ik_max_word 等)"filter": ["lowercase",              // 小寫轉換(可選,根據業務需求)"my_synonym_filter"       // 綁定同義詞過濾器]}}}},"mappings": {"properties": {"content": {"type": "text","analyzer": "my_synonym_analyzer",   // 索引時使用的分析器"search_analyzer": "my_synonym_analyzer"  // 查詢時使用的分析器(可與索引分析器不同)}}}
}
3. 同義詞文件的存儲與加載
  • 本地文件:將 synonyms.txt 放在 ES 節點的 config 目錄下(如 config/synonyms.txt),需確保所有節點路徑一致。
  • 遠程文件(ES 8+ 支持):通過 synonyms_path 指定 HTTP/HTTPS URL(如 https://example.com/synonyms.txt),ES 會定期拉取更新(需配置 update_interval):
    "my_synonym_filter": {"type": "synonym","synonyms_path": "https://example.com/synonyms.txt","update_interval": "1h"  // 每小時檢查一次更新
    }
    

三、索引階段 vs 查詢階段應用同義詞

同義詞過濾器可在 索引時(分析文檔內容)和 查詢時(分析搜索詞)應用,需根據業務需求選擇:

1. 索引時應用(推薦場景:文檔內容固定)
  • 配置:在 analyzer 中綁定同義詞過濾器(索引和查詢均使用該分析器)。
  • 效果:文檔中的同義詞會被預先擴展或替換,搜索時輸入任意同義詞均可匹配。
  • 優勢:查詢時無需處理同義詞擴展,降低查詢耗時。
  • 缺點:新增同義詞需重新索引文檔(否則舊文檔無法匹配新同義詞)。
2. 查詢時應用(推薦場景:同義詞規則頻繁更新)
  • 配置:僅在 search_analyzer 中綁定同義詞過濾器,索引時使用基礎分析器。
  • 效果:文檔內容保持原始詞項,搜索時搜索詞會被擴展為同義詞。
  • 優勢:同義詞規則更新無需重新索引文檔。
  • 缺點:查詢時需處理擴展,可能增加查詢耗時(尤其當同義詞數量大時)。
3. 混合應用(平衡方案)

同時在索引和查詢階段應用同義詞過濾器,但需確保兩者的同義詞規則一致,避免索引詞項與查詢詞項不匹配。例如:

"mappings": {"properties": {"content": {"type": "text","analyzer": "my_synonym_analyzer",       // 索引時擴展同義詞"search_analyzer": "my_synonym_analyzer" // 查詢時再次擴展同義詞}}
}

四、驗證同義詞效果

通過 ES 的 _analyze API 驗證分析器是否正確處理同義詞:

示例(驗證“美麗”的分詞結果)

GET /my_index/_analyze
{"analyzer": "my_synonym_analyzer","text": "美麗"
}

預期輸出(擴展模式):

{"tokens": [{ "token": "美麗", "start_offset": 0, "end_offset": 2 },{ "token": "漂亮", "start_offset": 0, "end_offset": 2 }  // 同義詞被擴展]
}

預期輸出(替換模式):

{"tokens": [{ "token": "美麗", "start_offset": 0, "end_offset": 2 }  // 僅保留替換后的詞項]
}

五、動態更新同義詞規則

若需動態更新同義詞(如新增“好看”作為“美麗”的同義詞),需執行以下步驟:

1. 更新同義詞文件

修改 synonyms.txt 或遠程文件,添加新規則:

美麗, 漂亮, 好看  // 擴展模式:三個詞互為同義詞
2. 刷新分析器(ES 8+ 支持)

通過 _indices/close_indices/open 重新加載分析器(需短暫關閉索引):

// 關閉索引
POST /my_index/_close// 打開索引(自動重新加載同義詞文件)
POST /my_index/_open

注意:關閉索引會導致該索引不可用,生產環境建議使用 滾動升級(Rolling Upgrade)雙索引切換 避免停機。

六、注意事項與優化

1. 性能影響
  • 擴展模式會增加詞項數量(如一個詞擴展為 5 個同義詞),可能導致索引體積增大和查詢耗時增加。
  • 替換模式可減少詞項數量,但需謹慎選擇基準詞(如統一為“美麗”),避免丟失語義。
2. 同義詞規則維護
  • 避免規則沖突(如“蘋果”既指水果又指品牌),可通過 上下文感知同義詞(需結合 context 過濾器,ES 8.7+ 支持):
    "my_synonym_filter": {"type": "synonym","synonyms": ["美麗, 漂亮 => #general",  // 通用上下文"蘋果, 水果 => #fruit",     // 水果上下文"蘋果, 手機 => #electronics" // 電子設備上下文]
    }
    
3. 中文分詞器適配
  • 若使用中文分詞器(如 IK、SmartCN),需確保同義詞過濾器在分詞器之后執行(避免分詞結果與同義詞規則不匹配)。例如:
    "analyzer": {"my_synonym_analyzer": {"tokenizer": "ik_max_word",  // 中文分詞器"filter": ["my_synonym_filter"        // 分詞后應用同義詞過濾器]}
    }
    

總結

ES 中實現同義詞映射的核心是通過 同義詞過濾器 在分詞階段擴展或替換詞項。關鍵步驟包括:

  1. 定義同義詞規則(擴展或替換模式);
  2. 創建包含同義詞過濾器的自定義分析器;
  3. 將分析器綁定到目標字段(索引和/或查詢階段);
  4. 驗證分詞效果并動態更新規則。

通過合理配置,可實現“美麗”和“漂亮”等同義詞在搜索時的智能映射,提升搜索結果的相關性。

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

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

相關文章

Web安全滲透測試基礎知識之SQL注入篇

一、SQL注入基礎理論 1.1 什么是SQL注入 SQL注入是一種常見的Web安全問題,攻擊者通過在Web應用程序的輸入字段中插入惡意的SQL語句,改變原本SQL查詢的邏輯,實現非法獲取數據、篡改數據、執行系統命令等操作。這種情況產生的根本原因在于應…

JVM方法區核心技術解析:從方法區到執行引擎

方法區 方法區的內部結構 在經典方法區設計中,主要存儲以下核心數據內容: 一、類型信息 方法區維護的類型信息包含以下要素: 類全稱標識 類名稱(含完整包路徑)直接父類的完全限定名(包含完整包路徑&am…

【MyBatis插件】PageHelper 分頁

前言 在開發 Web 應用時,我們經常需要處理海量數據的展示問題。例如,在一個電商平臺上,商品列表可能有成千上萬條數據。如果我們一次性將所有數據返回給前端,不僅會導致頁面加載緩慢,還會對數據庫造成巨大壓力。為了解…

springboot+vue實現在線書店(圖書商城)系統

今天教大家如何設計一個圖書商城 , 基于目前主流的技術:前端vue,后端springboot。 同時還帶來的項目的部署教程。 視頻演示 在線書城 圖片演示 一. 系統概述 商城是一款比較龐大的系統,需要有商品中心,庫存中心,訂單…

OPC UA + ABP vNext 企業級實戰:高可用數據采集框架指南

🚀📊 OPC UA ABP vNext 企業級實戰:高可用數據采集框架指南 🚀 📑 目錄 🚀📊 OPC UA ABP vNext 企業級實戰:高可用數據采集框架指南 🚀一、前言 🎯二、系統…

Oracle統計信息收集時的鎖持有階段

Oracle統計信息收集時的鎖持有階段 1 準備階段(共享模式鎖) 鎖類型:對象級共享鎖(S鎖) 持續時間:通常1-5秒 主要操作: 驗證對象存在性和權限檢查統計信息首選項設置確定采樣方法和并行度 監…

shell常用語法

一、shell變量 定義變量語法: 變量名值 # 等號兩邊不能有空格 示例: #!/bin/bash name"Alice" echo "Hello, $name!" # 使用變量使用變量-語法: 兩種方式: 第一種:${變量名} 第二種&#x…

《教育退費那些事兒:從困境到破局》

《教育退費那些事兒:從困境到破局》 教育退費:不容忽視的熱點問題 在當今社會,教育消費已成為家庭支出的重要組成部分。無論是 K12 階段的學科輔導、藝術特長培訓,還是成人的職業技能提升、學歷繼續教育,家長和學生們…

老字號煥新案例:天貓代運營如何讓傳統品牌年輕化破圈

老字號煥新案例:天貓代運營如何讓傳統品牌年輕化破圈 在消費升級與年輕化浪潮的沖擊下,傳統老字號品牌常面臨“有歷史無活力、有產品無流量”的困境。如何借助電商平臺實現品牌煥新,成為其破局的關鍵。品融(PINKROON&#xff09…

高可靠低紋波國產4644電源芯片在工業設備的應用

摘要 隨著工業自動化和智能化的飛速發展,工業設備對于電源芯片的性能和可靠性提出了前所未有的嚴格要求。電源芯片作為工業設備的核心供電組件,其性能直接影響到整個設備的運行效率和穩定性。本文以國科安芯的ASP4644四通道降壓穩壓器為例,通…

Vue組件-霓虹燈:技術解析與實現

Vue組件-霓虹燈:技術解析與實現 本文將詳細解析如何使用Vue 3實現一個動態炫彩霓虹燈效果。 預覽 概述 此Vue組件創建了一個由7個同心圓環組成的霓虹燈效果,每個圓環具有彩虹中的一種顏色(紅、橙、黃、綠、藍、靛、紫)。這些圓…

【實戰教程】從零實現DeepSeek AI多專家協作系統 - Spring Boot+React打造AI專家團隊協作平臺

🚀 本項目是DeepSeek大模型應用系列的V3版本,基于V1和V2版本的功能進行全面升級,引入了多智能體協作機制! 系列教程推薦閱讀順序: 【V1版本】零基礎搭建DeepSeek大模型聊天系統 - Spring BootReact完整開發指南【V2版本…

第8章-5 sql的執行順序

上一篇:《第8章-4 查詢性能優化2》,接著來了解查詢的執行順序,了解順序對于優化會有幫助。 1,sql編寫順序 select distinct 查詢字段 from 表名 JOIN 表名 ON 連接條件 where 查詢條件 group by 分組字段 having 分組后…

設計模式學習整理

目錄 UML類圖 設計模式六大原則 1.單一職責原則 2.里氏替換原則 3.依賴倒置原則 4.接口隔離原則 5.迪米特法則(最少知道原則) 6.開(放封)閉原則 設計模式分類 1.創建型模式 2.結構型模式 4.行為型模式 一、工廠模式(factory——簡單工廠模式和抽象工廠模式) 1.1、…

Linux干貨(二)

前言 從B站黑馬程序員Linux課程摘選的學習干貨,新手友好!若有侵權,會第一時間處理。 目錄 前言 1.cd pwd命令 1.cd命令的作用 2.pwd命令的作用 2.相對路徑絕對路徑和特殊路徑符 1.相對路徑和絕對路徑 1.絕對路徑 2.相對路徑 2.特殊…

ngx_http_keyval_module動態鍵值管理

一、模塊安裝與驗證 檢查模塊是否可用 nginx -V 2>&1 | grep --color -o ngx_http_keyval_module如果看到 ngx_http_keyval_module,說明模塊已編譯進 NGINX。 若未找到,請聯系你的 NGINX 供應商,獲取商業版或重新編譯并啟用該模塊&am…

upload-labs通關筆記-第4關 文件上傳之.htacess繞過

目錄 一、.htacess 二、代碼審計 三、php ts版本安裝 1、下載ts版本php 2、放入到phpstudy指定文件夾中 3、修改php配置文件 4、修改php.ini文件 5、修改httpd.conf文件 (1)定位文件 (2)修改文件 6、重啟小皮 7、切換…

LeetCode 88. 合并兩個有序數組 | Python 最簡寫法 + 實戰注釋

在日常刷題和面試中,「合并兩個有序數組」是一個經典基礎題。雖然屬于簡單難度,但它非常考察你的數組操作技巧和代碼優化能力。本篇文章將帶你從基礎解法入手,進階到最簡潔的三元表達式寫法,理解每一行代碼背后的邏輯。 ?? 題目描述 給你兩個按 非遞減順序 排列的整數數組…

Kafka進階指南:從原理到實戰

目錄 一、Kafka 基礎回顧 二、生產者進階 2.1 數據生產流程深度解析 2.2 關鍵配置參數詳解 2.3 序列化與自定義序列化器 三、消費者進階 3.1 消費方式與原理 3.2 分區分配策略 3.2.1 Range(范圍)策略 3.2.2 Round - Robin(輪詢&…

Lightpanda開源瀏覽器:專為 AI 和自動化而設計的無界面瀏覽器

?一、軟件介紹 文末提供程序和源碼下載 Lightpanda開源瀏覽器:專為 AI 和自動化而設計的無界面瀏覽器; Javascript execution Javascript 執行Support of Web APIs (partial, WIP)支持 Web API(部分、WIP)Compatible with Pla…