Elasticsearch 中文搜索:分析器與最佳實(shí)踐
Elasticsearch 的內(nèi)容索引中,分析和詞元化至關(guān)重要,尤其處理非英語語言時(shí)。對(duì)于中文,由于漢字的特性以及詞句之間缺乏空格,這一過程更為復(fù)雜。
本文探討 Elasticsearch 中分析中文內(nèi)容的幾種方案,包括默認(rèn)的中文分析器、paoding 插件、cjk 分析器、smartcn 分析器和 ICU 插件,并分析其優(yōu)缺點(diǎn)及適用場(chǎng)景。
中文搜索的挑戰(zhàn)
漢字是表意文字,代表一個(gè)詞或語素(語言中最小的有意義單位)。組合在一起,其含義會(huì)發(fā)生變化,代表一個(gè)全新的詞。另一個(gè)難點(diǎn)是詞句之間沒有空格,這使得計(jì)算機(jī)很難知道一個(gè)詞從哪里開始,到哪里結(jié)束。
即使只考慮普通話(中國(guó)官方語言,也是世界上使用最廣泛的漢語),也有數(shù)萬個(gè)漢字,即使實(shí)際書面漢語只需要認(rèn)識(shí)三千到四千個(gè)漢字。例如,“火山”(火山)實(shí)際上是以下兩個(gè)漢字的組合:
- 火:火
- 山:山
我們的分詞器必須足夠聰明,避免將這兩個(gè)漢字分開,因?yàn)樗鼈兘M合在一起的意義與分開時(shí)不同。
另一個(gè)難點(diǎn)是使用的拼寫變體:
- 簡(jiǎn)體中文:書法
- 繁體中文,更復(fù)雜、更豐富:書法
- 拼音,普通話的羅馬化形式:shū fǎ
Elasticsearch 中的中文分析器
目前,Elasticsearch 提供以下幾種中文分析器:
- 默認(rèn)的
Chinese
分析器,基于 Lucene 4 中已棄用的類; -
paoding
插件,雖然不再維護(hù),但基于非常好的詞典; -
cjk
分析器,它對(duì)內(nèi)容進(jìn)行二元組化; -
smartcn
分析器,一個(gè)官方支持的插件; - ICU 插件及其分詞器。
這些分析器的差異很大,我們將通過一個(gè)簡(jiǎn)單的測(cè)試詞“手機(jī)”來比較它們的性能?!笆謾C(jī)”的意思是“手機(jī)”,它由兩個(gè)漢字組成,分別表示“手”和“機(jī)”?!皺C(jī)”字還構(gòu)成許多其他詞:
- 機(jī)票:機(jī)票
- 機(jī)器人:機(jī)器人
- 機(jī)槍:機(jī)槍
- 機(jī)遇:機(jī)遇
我們的分詞不能拆分這些漢字,因?yàn)槿绻宜阉鳌笆謾C(jī)”,我不希望出現(xiàn)關(guān)于 Rambo 擁有機(jī)槍的任何文檔。
我們將使用強(qiáng)大的 _analyze
API 測(cè)試這些方案:
curl -XGET 'http://localhost:9200/chinese_test/_analyze?analyzer=paoding_analyzer1' -d '手機(jī)'
-
默認(rèn)的
Chinese
分析器: 它只將所有漢字分成詞元。因此,我們得到兩個(gè)詞元:手和機(jī)。Elasticsearch 的standard
分析器產(chǎn)生完全相同的輸出。因此,Chinese
已棄用,很快將被standard
取代,應(yīng)避免使用。 -
paoding
插件:paoding
幾乎是行業(yè)標(biāo)準(zhǔn),被認(rèn)為是一種優(yōu)雅的解決方案。不幸的是,Elasticsearch 的插件沒有維護(hù),我只能在經(jīng)過一些修改后才能在 1.0.1 版本上運(yùn)行它。(安裝步驟略,原文已提供)安裝后,我們得到了一個(gè)新的paoding
分詞器和兩個(gè)收集器:max_word_len
和most_word
。默認(rèn)情況下沒有公開分析器,因此我們必須聲明一個(gè)新的分析器。(配置步驟略,原文已提供)兩種配置都提供了良好的結(jié)果,具有清晰且唯一的詞元。在處理更復(fù)雜的句子時(shí),其行為也非常好。 -
cjk
分析器: 非常簡(jiǎn)單的分析器,它只將任何文本轉(zhuǎn)換成二元組?!笆謾C(jī)”只索引手機(jī)
,效果不錯(cuò),但如果我們使用更長(zhǎng)的詞,例如“元宵節(jié)”(元宵節(jié)),則會(huì)生成兩個(gè)詞元:元宵和宵節(jié),分別表示“元宵”和“宵節(jié)”。 -
smartcn
插件: 非常易于安裝。(安裝步驟略,原文已提供)它公開了一個(gè)新的smartcn
分析器,以及smartcn_tokenizer
分詞器,使用 Lucene 的SmartChineseAnalyzer
。它使用概率套件來查找單詞的最佳分割,使用隱馬爾可夫模型和大量的訓(xùn)練文本。因此,已經(jīng)嵌入了一個(gè)相當(dāng)好的訓(xùn)練詞典——我們的示例被正確地分詞了。 -
ICU 插件: 另一個(gè)官方插件。(安裝步驟略,原文已提供)如果您處理任何非英語語言,建議使用此插件。它公開了一個(gè)
icu_tokenizer
分詞器,以及許多強(qiáng)大的分析工具,如icu_normalizer
、icu_folding
、icu_collation
等。它使用中文和日文字典,其中包含有關(guān)詞頻的信息,以推斷漢字組。在“手機(jī)”上,一切正常,并且按預(yù)期工作,但在“元宵節(jié)”上,會(huì)產(chǎn)生兩個(gè)詞元:元宵和節(jié)——這是因?yàn)椤霸焙汀肮?jié)”比“元宵節(jié)”更常見。
結(jié)果比較 (表格略,原文已提供)
從我的角度來看,paoding
和 smartcn
獲得了最佳結(jié)果。chinese
分詞器非常糟糕,icu_tokenizer
在“元宵節(jié)”上有點(diǎn)令人失望,但在處理繁體中文方面表現(xiàn)非常好。
繁體中文支持
您可能需要處理來自文檔或用戶搜索請(qǐng)求的繁體中文。您需要一個(gè)規(guī)范化步驟將這些繁體輸入轉(zhuǎn)換為現(xiàn)代中文,因?yàn)橄?smartcn
或 paoding
這樣的插件無法正確處理它。
您可以通過您的應(yīng)用程序進(jìn)行處理,或者嘗試使用 elasticsearch-analysis-stconvert
插件直接在 Elasticsearch 中進(jìn)行處理。它可以雙向轉(zhuǎn)換繁體字和簡(jiǎn)體字。(安裝步驟略,原文已提供)
最后一種解決方案是使用 cjk
:如果您無法正確分詞輸入,您仍然很有可能捕獲所需的文檔,然后使用 icu_tokenizer
(也相當(dāng)好)來提高相關(guān)性。
進(jìn)一步的改進(jìn)
對(duì)于 Elasticsearch 的分析,沒有完美的萬能解決方案,中文也不例外。您必須根據(jù)獲得的信息來組合和構(gòu)建自己的分析器。例如,我在搜索字段上使用 cjk
和 smartcn
分詞,使用多字段和多匹配查詢。
(FAQ 部分略,原文已提供)
以上是有效的中文搜索與Elasticsearch的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級(jí)代碼編輯軟件(SublimeText3)

判斷密碼強(qiáng)度需結(jié)合正則與邏輯處理,基礎(chǔ)要求包括:1.長(zhǎng)度不少于8位;2.至少含小寫字母、大寫字母、數(shù)字;3.可加入特殊字符限制;進(jìn)階方面需避免連續(xù)重復(fù)字符及遞增/遞減序列,這需PHP函數(shù)檢測(cè);同時(shí)應(yīng)引入黑名單過濾常見弱密碼如password、123456;最終建議結(jié)合zxcvbn庫提升評(píng)估精度。

PHP變量作用域常見問題及解決方法包括:1.函數(shù)內(nèi)部無法訪問全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次并在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過濾;4.匿名函數(shù)需通過use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助于避免錯(cuò)誤并提升代碼穩(wěn)定性。

要安全處理PHP文件上傳需驗(yàn)證來源與類型、控制文件名與路徑、設(shè)置服務(wù)器限制并二次處理媒體文件。1.驗(yàn)證上傳來源通過token防止CSRF并通過finfo_file檢測(cè)真實(shí)MIME類型使用白名單控制;2.重命名文件為隨機(jī)字符串并根據(jù)檢測(cè)類型決定擴(kuò)展名存儲(chǔ)至非Web目錄;3.PHP配置限制上傳大小及臨時(shí)目錄Nginx/Apache禁止訪問上傳目錄;4.GD庫重新保存圖片清除潛在惡意數(shù)據(jù)。

PHP注釋代碼常用方法有三種:1.單行注釋用//或#屏蔽一行代碼,推薦使用//;2.多行注釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧注釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號(hào)和避免嵌套。

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

寫好PHP注釋的關(guān)鍵在于明確目的與規(guī)范,注釋應(yīng)解釋“為什么”而非“做了什么”,避免冗余或過于簡(jiǎn)單。1.使用統(tǒng)一格式,如docblock(/*/)用于類、方法說明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背后的原因,如說明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問題,便于后續(xù)追蹤與協(xié)作。好的注釋能降低溝通成本,提升代碼維護(hù)效率。

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

易于效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)
