快速做用 elasticsearch 做中文 n-gram 關鍵字全文搜尋
科技新知

MacauYeah・2025-01-16
有些時候,我們對一些文章資料,光是使用CtrlF文字區配搜尋,很難找到完全吻合的結果。這時候,我們可以試試看快速搭建自己的中文搜尋引擎,看看能不能更易地找到資料。而中文搜尋引擎,其實用免費的elasticsearch也可以做到。我們就來看看怎樣快速起lab吧。 經 docker 下載及運行 elasticsearch docker run p 127.0.0.192009200 d name elasticsearch e quot;discovery.type=singlenodequot; e quot;xpack.security.enabled=falsequot; e quot;xpack.license.self_generated.type=basicquot; v quot;elasticsearchdatausrshareelasticsearchdataquot; docker.elastic.coelasticsearchelasticsearch8.17.0 建立資料庫。在elasticsearch 中,示作index,並建立自己的ngram analyzer和tokenizer。 curl X PUT quot;localhost9200bookngramprettyquot; H 'ContentType applicationjson' d' quot;settingsquot; quot;indexquot; quot;max_ngram_diffquot; 4 , quot;analysisquot; quot;analyzerquot; quot;my_analyzerquot; quot;tokenizerquot; quot;my_tokenizerquot; , quot;tokenizerquot; quot;my_tokenizerquot; quot;typequot; quot;ngramquot;, quot;min_gramquot; 1, quot;max_gramquot; 5, quot;token_charsquot; quot;letterquot;, quot;digitquot; ' 假設資料庫每筆記錄有 record_id,title 和 content 三個欄位,其title, content都是中文內容。它們都套用 ngram analyzer 。 curl X PUT quot;localhost9200bookngram_mappingprettyquot; H 'ContentType applicationjson' d' quot;propertiesquot; quot;titlequot; quot;typequot; quot;textquot;, quot;analyzerquot; quot;my_analyzerquot;, quot;fieldsquot; quot;keywordquot; quot;typequot; quot;keywordquot; , quot;contentquot; quot;typequot; quot;textquot;, quot;analyzerquot; quot;my_analyzerquot;, quot;fieldsquot; quot;keywordquot; quot;typequot; quot;keywordquot; , quot;record_idquot; quot;typequot; quot;textquot;, quot;fieldsquot; quot;keywordquot; quot;typequot; quot;keywordquot; ' 批量上傳內容。如果要上載json檔,請把 d'xxx' 改為 databinary @FILENAME curl X POST quot;localhost9200_bulkprettyquot; H 'ContentType applicationjson' d' quot;indexquot; quot;_indexquot; quot;bookngramquot; quot;record_idquot;quot;1quot;,quot;titlequot;quot;紅樓夢quot;,quot;contentquot;quot;甄士隱夢幻識通靈賈雨村風塵懷閨秀quot; quot;indexquot; quot;_indexquot; quot;bookngramquot; quot;record_idquot;quot;2quot;,quot;titlequot;quot;西遊記quot;,quot;contentquot;quot;混沌未分天地亂,茫茫渺渺無人見。自從盤古破鴻蒙,開闢從茲清濁辨。覆載群生仰至仁,發明萬物皆成善。quot; quot;indexquot; quot;_indexquot; quot;bookngramquot; quot;record_idquot;quot;3quot;,quot;titlequot;quot;水滸傳quot;,quot;contentquot;quot;張天師祈禳瘟疫洪太尉誤走妖魔quot; ' 多欄位搜尋,並指定title的權重為content的兩倍。 curl X GET quot;localhost9200bookngram_searchprettyquot; H 'ContentType applicationjson' d' quot;queryquot; quot;multi_matchquot; quot;queryquot; quot;開天闢地quot;, quot;fieldsquot; quot;title2quot;, quot;contentquot;, quot;analyzerquot; quot;my_analyzerquot; '