完整、可落地的 Elasticsearch 拼音補全配置模板 設計方案

在中文搜索場景中,用戶經常使用拼音輸入(如 “iPhone”、“pingguo”)來搜索中文內容(如“蘋果手機”)。為了提升用戶體驗,Elasticsearch 可通過 拼音分詞器 + Completion Suggester 實現 拼音補全(Pinyin Completion) 功能。

本文提供一套 完整、可落地的 Elasticsearch 拼音補全配置模板,支持:

  • 中文輸入 → 中文補全
  • 拼音輸入 → 中文補全
  • 拼音首字母輸入 → 中文補全
  • 自動糾錯與模糊匹配

一、前置準備

1. 安裝拼音分詞插件

Elasticsearch 官方不自帶拼音分詞器,需安裝第三方插件:

# 進入 Elasticsearch 插件目錄
cd /usr/share/elasticsearch# 安裝拼音分詞器(根據 ES 版本選擇)
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v8.11.0/elasticsearch-analysis-pinyin-8.11.0-linux-x86_64.zip

? 支持版本:6.x ~ 8.x,GitHub 項目地址

重啟 Elasticsearch 使插件生效。


二、索引配置模板

PUT /products-pinyin
{"settings": {"analysis": {"analyzer": {"pinyin_analyzer": {"type": "custom","tokenizer": "pinyin","filter": ["lowercase"]}},"tokenizer": {"pinyin": {"type": "pinyin","keep_separate_first_letter": false,"keep_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"lowercase": true,"remove_duplicated_term": true}}}},"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_max_word","fields": {"pinyin": {"type": "text","analyzer": "pinyin_analyzer"}}},"suggest": {"type": "completion","analyzer": "simple","preserve_separators": true,"preserve_position_increments": true,"max_input_length": 50},"suggest_pinyin": {"type": "completion","analyzer": "pinyin_analyzer","preserve_separators": false,"preserve_position_increments": false,"max_input_length": 50}}}
}

三、字段說明

字段用途
title原始文本,用于全文搜索
title.pinyin用于拼音搜索(如 match: { "title.pinyin": "pingguo" }
suggest支持中文輸入補全(如“蘋” → “蘋果手機”)
suggest_pinyin支持拼音輸入補全(如“ping” → “蘋果手機”)

四、寫入文檔示例

PUT /products-pinyin/_doc/1
{"title": "蘋果手機 iPhone 15","suggest": {"input": ["蘋果手機","iPhone 15","蘋果","手機"],"weight": 30},"suggest_pinyin": {"input": ["pingguoshouji","yinguoshouji","pingguo","shouji","pgs","pg"],"weight": 30}
}

? input 列表包含:

  • 完整拼音:pingguoshouji
  • 首字母:pgspg
  • 分詞拼音:pingguo, shouji

五、查詢方式

1. 中文前綴補全

POST /products-pinyin/_search
{"suggest": {"text": "蘋","completion": {"field": "suggest"}}
}

返回:

"suggest": [{"text": "蘋","options": [{ "text": "蘋果手機", "score": 30 }]}
]

2. 拼音前綴補全

POST /products-pinyin/_search
{"suggest": {"text": "ping","completion": {"field": "suggest_pinyin"}}
}

返回:

"options": [{ "text": "pingguoshouji", "score": 30 }
]

?? 返回的是拼音,需在應用層映射回原始標題。

? 建議:在 suggest_pinyin_source 中存儲原始 title

"suggest_pinyin": {"input": ["pingguo"],"weight": 30,"_source": "蘋果手機 iPhone 15"
}

3. 拼音首字母補全

POST /products-pinyin/_search
{"suggest": {"text": "pgs","completion": {"field": "suggest_pinyin"}}
}

只要 input 中包含 pgs,即可匹配。


4. 模糊拼音補全(支持糾錯)

"suggest": {"text": "pinggou","completion": {"field": "suggest_pinyin","fuzzy": {"fuzziness": 1,"transpositions": true}}
}

可匹配 pingguo(編輯距離為 1)。


六、優化建議 ?

場景建議
輸入性能預生成拼音和首字母,避免運行時計算
存儲空間suggest_pinyin.input 可能較多,控制 max_input_length
權重控制熱門商品設置更高 weight
緩存應用層緩存高頻拼音前綴(如“i”, “ip”, “iph”)
多語言支持英文、拼音混合輸入

七、完整補全流程(應用層)

def get_suggestions(user_input):suggestions = []# 1. 如果是中文,查 suggestif is_chinese(user_input):res = es.search(index="products-pinyin", suggest={"text": user_input, "completion": {"field": "suggest"}})for opt in res['suggest'][0]['options']:suggestions.append(opt['text'])# 2. 如果是拼音,查 suggest_pinyinelif is_pinyin(user_input):res = es.search(index="products-pinyin", suggest={"text": user_input, "completion": {"field": "suggest_pinyin"}, "fuzzy": {"fuzziness": 1}})for opt in res['suggest'][0]['options']:# 從 _source 或映射表獲取原始標題original = get_title_by_pinyin(opt['text'])if original not in suggestions:suggestions.append(original)return suggestions[:10]

八、擴展建議

場景建議方案
動態拼音生成寫入時用 Ingest Pipeline 自動生成拼音
拼音 + 中文混合補全使用 multi_match 查詢 title.pinyintitle
個性化補全結合用戶歷史行為調整 weight
冷啟動問題初始填充運營配置的熱門詞
性能監控監控 suggest 查詢延遲與命中率

九、Ingest Pipeline 自動生成拼音(可選)

PUT /_ingest/pipeline/add_pinyin_suggest
{"description": "自動添加拼音補全字段","processors": [{"script": {"lang": "painless","source": """ctx.suggest_pinyin = [];def inputs = [ctx.title];// 可調用外部服務生成拼音// 此處簡化為固定值ctx.suggest_pinyin.add('pingguoshouji');ctx.suggest_pinyin.add('pgs');"""}}]
}

寫入時使用:

PUT /products-pinyin/_doc/2?pipeline=add_pinyin_suggest
{"title": "華為手機"
}

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

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

相關文章

Redis面試精講 Day 23:Redis與數據庫數據一致性保障

【Redis面試精講 Day 23】Redis與數據庫數據一致性保障 在“Redis面試精講”系列的第23天,我們將深入探討Redis與數據庫數據一致性保障這一在高并發分布式系統中極為關鍵的技術難題。該主題是面試中的高頻壓軸題,常出現在中高級后端開發、架構師崗位的考…

HTML <link rel=“preload“>:提前加載關鍵資源的性能優化利器

在網頁性能優化中&#xff0c;“資源加載時機”是影響用戶體驗的關鍵因素——一個延遲加載的核心CSS可能導致頁面“閃白”&#xff0c;一段未及時加載的關鍵JS可能讓交互按鈕失效。傳統的資源加載方式&#xff08;如<link>加載CSS、<script>加載JS&#xff09;依賴…

WPF加載記憶上次圖像

問題點使用MVVM先viewModel構造函數然后才Loaded事件,但Loaded事情時halcon控件沒有加載完畢。Window_ContentRendered事件中halcon控件才有了句柄。解決問題1.viewModel函數中調用相機的類獲取相機名(在這里是為了MVVM中以后可以做其它的事情如識別二維碼)2.在Window_ContentR…

AT89C52單片機介紹

目錄 1AT89C52原理圖及結構框圖 1.1 原理圖 1.2 AT89C52 結構框圖 1.2.1 8 位 CPU 1.2.2 存儲器 1.2.3 I/O 端口 1.2.4 定時器 / 計數器 1.2.5 串行通信接口 1.2.6 中斷系統 1.2.7 時鐘與復位 1.2.8 總線結構 1.2.9 特殊功能寄存器區 2 AT89C52引腳介紹(PDIP) …

聯網車輛功能安全和網絡安全的挑戰與當前解決方案

摘要在過去的二十年里&#xff0c;數字化重塑了我們的日常生活&#xff0c;汽車行業也身處這一變革之中。如今的車輛正變得日益智能且聯網&#xff0c;具備了更多的安全和便捷功能&#xff08;如自動緊急制動、自適應巡航控制&#xff09;。下一代車輛將實現高度自動化乃至 5 級…

網絡安全(Java語言)腳本 匯總(二)

文章目錄目錄遍歷漏洞掃描器源代碼思路一、核心功能二、依賴庫三、核心流程四、關鍵方法五、數據結構六、輸出信息目錄遍歷漏洞掃描器 源代碼 /*** description : 目錄遍歷漏洞掃描器* 注意; 在輸入URL時 要求必須保存 ?page 的末尾 才能保證路徑合成的有效性*//*** desc…

基于 ArcFace/ArcMargin 損失函數的深度特征學習高性能人臉識別解決方案

要實現當前最先進的人臉識別系統,我們需要采用業界公認性能最佳的算法框架,主要包括基于 ArcFace/ArcMargin 損失函數的深度特征學習、MTCNN 人臉檢測與對齊以及高效特征檢索三大核心技術。以下是優化后的解決方案: 核心優化點說明 算法選擇:采用 ArcFace(Additive Angul…

Sql server 查詢每個表大小

在SQL Server中&#xff0c;你可以通過查詢系統視圖和系統表來獲取數據庫中每個表的大小。這可以通過幾種不同的方式來實現&#xff0c;下面是一些常用的方法&#xff1a;方法1&#xff1a;使用sp_spaceused存儲過程sp_spaceused是一個內置的存儲過程&#xff0c;可以用來顯示數…

react 錯誤邊界

注意點&#xff1a; 類組件是可以和函數式組件混合寫的&#xff01;&#xff01;&#xff01;getDerivedStateFromError是靜態的&#xff0c;避免副作用&#xff0c;如果想將錯誤上報到服務器&#xff0c;則去componentDidCatch里去處理。getDerivedStateFromError直接返回{ ha…

自定義 VSCode 標題欄以區分不同版本

自定義 VSCode 標題欄以區分不同版本 當您在同一臺計算機上使用多個 Visual Studio Code 版本時&#xff0c;自定義窗口標題欄是一個有效的方法&#xff0c;可以幫助您快速區分它們。 為何需要區分多個 VSCode 版本&#xff1f; 在同一臺電腦上安裝和使用多個 VSCode 實例是很常…

失敗存儲:查看未成功的內容

作者&#xff1a;來自 Elastic James Baiera 及 Graham Hudgins 了解失敗存儲&#xff0c;這是 Elastic Stack 的一項新功能&#xff0c;用于捕獲和索引之前丟失的事件。 想獲得 Elastic 認證嗎&#xff1f;看看下一期 Elasticsearch Engineer 培訓什么時候開始&#xff01; E…

基于Spring Boot+Vue的萊元元電商數據分析系統 銷售數據分析 天貓電商訂單系統

&#x1f525;作者&#xff1a;it畢設實戰小研&#x1f525; &#x1f496;簡介&#xff1a;java、微信小程序、安卓&#xff1b;定制開發&#xff0c;遠程調試 代碼講解&#xff0c;文檔指導&#xff0c;ppt制作&#x1f496; 精彩專欄推薦訂閱&#xff1a;在下方專欄&#x1…

Node.js/Python 實戰:封裝淘寶商品詳情 API 客戶端庫(SDK)

在開發電商相關應用時&#xff0c;我們經常需要與淘寶 API 交互獲取商品數據。直接在業務代碼中處理 API 調用邏輯會導致代碼冗余且難以維護。本文將實戰演示如何使用 Node.js 和 Python 封裝一個高質量的淘寶商品詳情 API 客戶端庫&#xff08;SDK&#xff09;&#xff0c;使開…

【Docker】關于hub.docker.com,無法打開,國內使用dockers.xuanyuan.me搜索容器鏡像、查看容器鏡像的使用文檔

&#x1f527; 一、國內鏡像搜索替代方案 國內鏡像源網站 毫秒鏡像&#xff1a;支持鏡像搜索&#xff08;如 https://dockers.xuanyuan.me&#xff09;&#xff0c;提供中文文檔服務&#xff08;https://dockerdocs.xuanyuan.me&#xff09;&#xff0c;可直接搜索鏡像名稱并…

2025盛夏AI熱浪:八大技術浪潮重構數字未來

——從大模型革命到物理智能&#xff0c;AI如何重塑產業與人機關系&#x1f31f; 引言&#xff1a;AI從“技術爆炸”邁向“應用深水區」代碼示例&#xff1a;AI商業化閉環驗證模型# 驗證AI商業化閉環的飛輪效應 def validate_ai_flywheel(compute_invest, app_adoption): re…

從希格斯玻色子到 QPU:C++ 的跨維度征服

一、引言&#xff1a;粒子物理與量子計算的交匯點在當代物理學和計算機科學的前沿領域&#xff0c;希格斯玻色子研究與量子計算技術的交匯正形成一個激動人心的跨學科研究方向。希格斯玻色子作為標準模型中最后被發現的基本粒子&#xff0c;其性質和行為對我們理解物質質量的起…

Elasticsearch:如何使用 Qwen3 來做向量搜索

在這篇文章中&#xff0c;我們將使用 Qwen3 來針對數據進行向量搜索。我們將對數據使用 qwen3 嵌入模型來進行向量化&#xff0c;并使用 Qwen3 來對它進行推理。在閱讀這篇文章之前&#xff0c;請閱讀之前的文章 “如何使用 Ollama 在本地設置并運行 Qwen3”。 安裝 Elasticsea…

Mybatis實現頁面增刪改查

一、改變路由警告 二、實現新增數據 1.UserMapper.xml 2.Controller層 注意:前端傳的是json對象,所以后臺也需要使用JSON 3.設置提交的表單 <el-dialog title"信息" v-model"data.formVisible" width"30%" destroy-on-close><el-form…

Rabbitmq+STS+discovery_k8s +localpv部署排坑詳解

#作者&#xff1a;朱雷 文章目錄一、部署排坑1.1. configmap配置文件1.2. pv文件1.3. sc文件1.4. serviceAccount文件1.5. headless-service文件1.6. sts文件二、RabbitMQ集群部署關鍵問題總結一、部署排坑 1.1. configmap配置文件 編輯cm.yaml 文件 apiVersion: v1 kind: C…

8.14 模擬

lc658. deque 定長滑窗class Solution { public:vector<int> findClosestElements(vector<int>& arr, int k, int x) {int n arr.size();int l 0, r 0;deque<int> dq;while (r < n) {dq.push_back(arr[r]);if (dq.size() > k) {// 核心&#xf…