elasticsearch如何使用Ngram實(shí)現(xiàn)任意位數(shù)手機(jī)號搜索
Ngram自定義分詞案例
當(dāng)對keyword類型的字段進(jìn)行高亮查詢時,若值為123asd456,查詢sd4,則高亮結(jié)果是<em>123asd456<em>。那么,有沒有辦法只對sd4高亮呢?用一句話來概括問題:明明只想查詢ID的一部分,但高亮結(jié)果是整個ID串,此時應(yīng)該怎么辦?
實(shí)戰(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)了,沒有達(dá)到預(yù)期。
檢索過程中選擇使用wildcard是為了解決子串匹配的問題,wildcard的實(shí)現(xiàn)邏輯類似于MySQL的like模糊匹配。傳統(tǒng)的text標(biāo)準(zhǔn)分詞器,包括中文分詞器ik、英文分詞器english、standard等都不能解決上述子串匹配問題。
而實(shí)際業(yè)務(wù)需求是這樣的:一方面要求輸入子串能召回全串;另一方面要求檢索的子串實(shí)現(xiàn)高亮。對此,只能更換一種分詞來實(shí)現(xiàn),即Ngram。
Ngram分詞器定義
Ngram分詞定義
Ngram是一種基于統(tǒng)計(jì)語言模型的算法。Ngram基本思想是將文本里面的內(nèi)容按照字節(jié)大小進(jìn)行滑動窗口操作,形成長度是N的字節(jié)片段序列。此時每一個字節(jié)片段稱為gram。對所有g(shù)ram的出現(xiàn)頻度進(jìn)行統(tǒng)計(jì),并且按照事先設(shè)定好的閾值進(jìn)行過濾,形成關(guān)鍵gram列表,也就是這個文本的向量特征空間。列表中的每一種gram就是一個特征向量維度。
該模型基于這樣一種假設(shè),第N個詞的出現(xiàn)只與前面N-1個詞相關(guān),而與其他任何詞都不相關(guān),整句的概率就是各個詞出現(xiàn)概率的乘積。這些概率可以通過直接從語料中統(tǒng)計(jì)N個詞同時出現(xiàn)的次數(shù)得到。常用的是二元的Bi-Gram(二元語法)和三元的Tri-Gram(三元語法)。
Ngram分詞示例
以“你今天吃飯了嗎“這一中文句子為例,它的Bi-Gram分詞結(jié)果如下。

Ngram分詞應(yīng)用場景
場景1:文本壓縮、檢查拼寫錯誤、加速字符串查找、文獻(xiàn)語種識別。
場景2:自然語言處理自動化領(lǐng)域得到新的應(yīng)用。如自動分類、自動索引、超鏈的自動生成、文獻(xiàn)檢索、無分隔符語言文本的切分等。
場景3:自然語言的自動分類功能。針對Elasticsearch檢索,Ngram針對無分隔符語言文本的分詞(比如手機(jī)號檢索),可提高檢索效率(相較于wildcard檢索和正則匹配檢索來說)
Ngram分詞實(shí)戰(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實(shí)現(xiàn)任意位數(shù)手機(jī)號搜索的文章就介紹到這了,更多相關(guān)elasticsearch任意位數(shù)手機(jī)號搜索內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Iris 環(huán)境搭建詳細(xì)教程(最新版Go&IDEA&IrisV12)
這篇文章主要介紹了Iris 環(huán)境搭建(最新版Go&IDEA&IrisV12),本文通過示例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11
支付寶小程序向用戶發(fā)紅包的實(shí)現(xiàn)方法
這篇文章主要介紹了支付寶小程序向用戶發(fā)紅包的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
最新Adobe?2022全新上線?Adobe?2022永久免費(fèi)使用教程
目前adobe2022的配置要求CPU至少是四核,運(yùn)行內(nèi)存至少是16GB,只支持windows10系統(tǒng),版本號是1809以及更高的版本,下面跟隨小編看下最新Adobe?2022全新上線?Adobe?2022永久免費(fèi)使用教程,感興趣的朋友一起看看吧2021-12-12
AIGC與虛擬現(xiàn)實(shí)(VR)的結(jié)合與應(yīng)用前景分析
隨著AIGC與VR技術(shù)的不斷進(jìn)步,兩者的結(jié)合為教育、娛樂、醫(yī)療等領(lǐng)域帶來了新機(jī)遇,AIGC可以自動生成文本、圖像等內(nèi)容,結(jié)合VR技術(shù),為用戶提供更加豐富和互動的體驗(yàn),本文探討了AIGC與VR的結(jié)合方式、應(yīng)用案例和未來發(fā)展趨勢2024-11-11
lambda 表達(dá)式導(dǎo)致 Arthas 無法 redefine 的問題
這篇文章主要介紹了lambda 表達(dá)式導(dǎo)致 Arthas 無法 redefine 的問題,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
使用Windows自帶的IIS服務(wù)搭建本地站點(diǎn)并遠(yuǎn)程訪問的操作方法
在Windows系統(tǒng)中實(shí)際上集成了建立網(wǎng)站所必須的軟件環(huán)境,今天就讓我們來看看,如何使用Windows自帶的網(wǎng)站程序建立網(wǎng)站吧,感興趣的朋友一起看看吧2023-12-12

