elasticsearch如何使用Ngram實現(xiàn)任意位數(shù)手機號搜索
Ngram自定義分詞案例
當(dāng)對keyword類型的字段進行高亮查詢時,若值為123asd456,查詢sd4,則高亮結(jié)果是<em>123asd456<em>。那么,有沒有辦法只對sd4高亮呢?用一句話來概括問題:明明只想查詢ID的一部分,但高亮結(jié)果是整個ID串,此時應(yīng)該怎么辦?
實戰(zhàn)問題拆解
###定義索引 PUT my_index_0602 { "mappings": { "properties": { "phoneNum": { "type": "keyword" } } } } ####批量寫入數(shù)據(jù) POST my_index_0602/_bulk {"index":{"_id":1}} {"phoneNum":"13511112222"} {"index":{"_id":2}} {"phoneNum":"13844248474"} ###執(zhí)行模糊檢索和高亮顯示 POST my_index_0602/_search { "highlight": { "fields": { "phoneNum": {} } }, "query": { "bool": { "should": [ { "wildcard": { "phoneNum": "*1111*" } } ] } } }
高亮檢索結(jié)果如下。
也就是說,整個字符串都呈現(xiàn)為高亮狀態(tài)了,沒有達到預(yù)期。
檢索過程中選擇使用wildcard是為了解決子串匹配的問題,wildcard的實現(xiàn)邏輯類似于MySQL的like模糊匹配。傳統(tǒng)的text標準分詞器,包括中文分詞器ik、英文分詞器english、standard等都不能解決上述子串匹配問題。
而實際業(yè)務(wù)需求是這樣的:一方面要求輸入子串能召回全串;另一方面要求檢索的子串實現(xiàn)高亮。對此,只能更換一種分詞來實現(xiàn),即Ngram。
Ngram分詞器定義
Ngram分詞定義
Ngram是一種基于統(tǒng)計語言模型的算法。Ngram基本思想是將文本里面的內(nèi)容按照字節(jié)大小進行滑動窗口操作,形成長度是N的字節(jié)片段序列。此時每一個字節(jié)片段稱為gram。對所有g(shù)ram的出現(xiàn)頻度進行統(tǒng)計,并且按照事先設(shè)定好的閾值進行過濾,形成關(guān)鍵gram列表,也就是這個文本的向量特征空間。列表中的每一種gram就是一個特征向量維度。
該模型基于這樣一種假設(shè),第N個詞的出現(xiàn)只與前面N-1個詞相關(guān),而與其他任何詞都不相關(guān),整句的概率就是各個詞出現(xiàn)概率的乘積。這些概率可以通過直接從語料中統(tǒng)計N個詞同時出現(xiàn)的次數(shù)得到。常用的是二元的Bi-Gram(二元語法)和三元的Tri-Gram(三元語法)。
Ngram分詞示例
以“你今天吃飯了嗎“這一中文句子為例,它的Bi-Gram分詞結(jié)果如下。
Ngram分詞應(yīng)用場景
場景1:文本壓縮、檢查拼寫錯誤、加速字符串查找、文獻語種識別。
場景2:自然語言處理自動化領(lǐng)域得到新的應(yīng)用。如自動分類、自動索引、超鏈的自動生成、文獻檢索、無分隔符語言文本的切分等。
場景3:自然語言的自動分類功能。針對Elasticsearch檢索,Ngram針對無分隔符語言文本的分詞(比如手機號檢索),可提高檢索效率(相較于wildcard檢索和正則匹配檢索來說)
Ngram分詞實戰(zhàn)
###定義索引 PUT my_index_0603 { "settings":{ "number_of_shards":1, "number_of_replicas":0, "index.max_ngram_diff" : 10, "analysis":{ "analyzer":{ "phoneNo_analyzer":{ "tokenizer": "phoneNo_analyzer" } }, "tokenizer":{ "phoneNo_analyzer":{ "type": "ngram", "min_gram": 4, "max_gram": 11, "token_chars": [ "letter","digit" ] } } } }, "mappings":{ "dynamic":"strict", "properties":{ "phoneNo":{ "type":"text", "analyzer": "phoneNo_analyzer" } } } } ####批量寫入數(shù)據(jù) POST my_index_0603/_bulk {"index":{"_id":1}} {"phoneNo":"13511112222"} {"index":{"_id":2}} {"phoneNo":"13844248474"} POST my_index_0603/_analyze { "analyzer": "phoneNo_analyzer", "text": "13511112222" } POST my_index_0603/_search { "highlight": { "fields": { "phoneNo": {} } }, "query": { "bool": { "should": [ { "match_phrase": { "phoneNo": "1111" } } ] } } }
到此這篇關(guān)于elasticsearch如何使用Ngram實現(xiàn)任意位數(shù)手機號搜索的文章就介紹到這了,更多相關(guān)elasticsearch任意位數(shù)手機號搜索內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
superset在linux和windows下的安裝和部署詳細教程
Superset 是 Airbnb開源的數(shù)據(jù)探查與可視化平臺,是個輕量級的BI工具,開發(fā)者可以在其開源代碼上根據(jù)需要進行二次開發(fā)。這篇文章主要介紹了superset在linux和windows下的安裝和部署詳細教程,需要的朋友可以參考下2020-10-10解決Visual Studio 2019本地不能運行Azure Functions
本文主要介紹了Visual Studio 2019本地不能運行Azure Functions的解決方方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06Elasticsearch索引的分片分配Recovery使用講解
這篇文章主要為大家介紹了Elasticsearch索引的分片分配Recovery使用講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04如何配置openai的返回Stream數(shù)據(jù)并轉(zhuǎn)發(fā)到h5頁面按markdown格式流式輸出(最新推薦)
這篇文章主要介紹了如何配置openai的返回Stream數(shù)據(jù)并轉(zhuǎn)發(fā)到h5頁面按markdown格式流式輸出,本文通過示例代碼演示如何使用OpenAI?API來實現(xiàn)流式輸出并分段加載,需要的朋友可以參考下2023-05-05C++ Go語言實現(xiàn)將windows和linux文件刪除至回收站
這篇文章主要為大家詳細介紹了如何分別使用C++ Go語言實現(xiàn)將windows和linux文件刪除至回收站,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12