日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

match_phrase搜不出来,怎么办?

發布時間:2024/1/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 match_phrase搜不出来,怎么办? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、問題拋出

某個詞組在Elasitcsearch中的某個document中存在,就一定通過某種匹配方式把它搜出來。?
舉例:

title=公路局正在治理解放大道路面積水問題。

輸入關鍵詞:道路,能否搜索到這個document呢??
實際應用中可能需要:?
1)檢索關鍵詞”理解”、”解放”、”道路”、“理解放大”,都能搜出這篇文檔。?
2)單個的字拆分“治”、“水”太多干擾,不要被檢索出來。?
3)待檢索的詞不在詞典中,也必須要查到。?
4)待檢索詞只要在原文title或content中出現,都要檢索到。?
5)檢索要快,要摒棄wildcard模糊匹配性能問題。

2、問題分析

常用的stand標準分詞,可以滿足要求1)、3)、4)、5)。?
標準分詞器是什么鬼??
標準分析儀是默認分析儀,如果沒有指定,則默認使用該分詞器。 它提供了基于語法的標記,并且適用于大多數語言。?
對于中文字符串,會逐個漢字分詞。?
標準分詞器的結果如下:

GET /ik_index/_analyze?analyzer=standard { "text":"公路局正在治理解放大道路面積水問題" } 公,路,局,正,在,治,理,解,放,大,道,路,面,積,水,問,題

但,會出現冗余數據非常多。?
針對要求2),排除match檢索,排除stand分詞。?
針對要求5),排除wildcard模糊檢索。?
針對要求3)、4),新詞也要被檢索到比如:“聲臨其境”、“孫大?!钡纫惨鼙凰阉鞯健?
針對要求1),采用match_phrase貌似靠譜些。

3、小試牛刀

先使用IK-max-word細粒度分詞器,結合match_phrase試一試?

步驟1:定義索引和Mapping

PUT ik_index {"mappings":{"ik_type":{"properties":{"title":{"type":"text","fields":{"ik_my_max":{"type":"text","analyzer":"ik_max_word"},"ik_my_smart":{"type":"text","analyzer":"ik_smart"},"keyword":{"type":"keyword","ignore_above":256}}}}}}}

這里,為了驗證分詞,同時使用了ik_smart和ik_max兩種分詞。?
實際開發中不需要,因為:兩種分詞共存,會導致導入數據創建索引的時候,索引會非常大,對磁盤和檢索性能都會有影響。

步驟2:插入文檔

POST ik_index/ik_type/3 {"title":"公路局正在治理解放大道路面積水問題" }

步驟3:實施檢索

POST ik_index/ik_type/_search {"profile":"true","query":{"match_phrase":{"title.ik_my_max":"道路"}} }

搜索結果如下:?
無結果返回。

{"took": 1,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 0,"max_score": null,"hits": []} }

為什么使用了max_word細粒度分詞,使用了match_pharse檢索,為什么沒有結果。?
分析一下:?
細粒度ik_max_word分詞結果為:

GET /ik_index/_analyze?analyzer=ik_max_word { "text":"公路局正在治理解放大道路面積水問題" } 公路局 ,公路 ,路局 ,路 ,局正 ,正在 ,正 ,治理 ,治 ,理解 , 理 ,解放 ,解 ,放大 ,大道 ,大 ,道路 ,道 ,路面 ,路 , 面積 ,面 ,積水 ,積 ,水 ,問題

以上方式,除了可以返回分詞結果外,還能返回詞所在的位置position。

構建索引的時候,道路被拆分為:道路:16,道:17,路:19。(注意中間加了18:路面)

{"token": "路面","start_offset": 11,"end_offset": 13,"type": "CN_WORD","position": 18}

而檢索的時候,而道路拆分為: 道路0 道1 路2

match_phrase檢索時候,文檔必須同時滿足以下兩個條件,才能被檢索到:?
1)分詞后所有詞項都出現在該字段中;?
2)字段中的詞項順序要一致。?
位置信息可以被存儲在倒排索引中,因此 match_phrase 查詢這類對詞語位置敏感的查詢, 就可以利用位置信息去匹配包含所有查詢詞項,且各詞項順序也與我們搜索指定一致的文檔,中間不夾雜其他詞項。

為了驗證如上的解釋,新增一篇“道路”相關的title,檢驗一下:

POST ik_index/ik_type/4 {"title":"黨員干部堅持走馬克思主義道路的重要性" }

注意:這時,搜索道路是可以匹配到的。

"hits": {"total": 1,"max_score": 1.9684901,"hits": [{"_index": "ik_index","_type": "ik_type","_id": "4","_score": 1.9684901,"_source": {"title": "黨員干部堅持走馬克思主義道路的重要性"}}]},

細粒度ik_max_word分詞結果為:

黨員干部, 黨員, 干部, 堅持走, 堅持, 堅, 持, 走馬, 馬克思主義, 馬克思, 馬克, 馬, 克, 思, 主義, 道路, 道, 路, 重要性, 重要, 要性, 性

構建索引的時候,道路被拆分為:15,16,17位置。?
與檢索的詞項順序是一致的。?
這里解析更詳細:http://t.cn/R8pzw9e

4、match_pharse都搜不出來,還有沒有別的方案?

有,和match_pharse類似,不過match_phrase_prefix支持最后一個term前綴匹配。?
除了把查詢文本的最后一個分詞只做前綴匹配之外,match_phrase_prefix和match_phrase查詢基本一樣,參數 max_expansions 控制最后一個單詞會被重寫成多少個前綴,也就是,控制前綴擴展成分詞的數量,默認值是50(官網文檔建議50)。?
擴展的前綴數量越多,找到的文檔數量就越多;?
如果前綴擴展的數量太少,可能查找不到相應的文檔,遺漏數據。

POST ik_index/ik_type/_search {"profile":"true","query":{"match_phrase_prefix" : {"title.ik_my_max" : {"query": "道路","max_expansions": 50}} } }

經驗證: 關鍵詞”理解”、”解放”、”道路”、“理解放大”,都能搜出這篇文檔。

5、應用場景

我們自己開發搜索引擎的時候,經常會出現基于title或者content字段進行檢索。?
如果用match檢索,會出現噪音很多的情況;?
如果用match_phrase,會出現某些字段檢索不出來的情況,如上分析的“道路”;?
如果用wildcard,能檢索出來,但又有性能問題的存在。?
這時候,可以考慮下: match_phrase_prefix。

6、小結

實際開發中,根據應用場景不同,采用不同的分詞器。?
如果選用ik,建議使用ik_max_word分詞,因為:ik_max_word的分詞結果包含ik_smart。?
匹配的時候,如果想盡可能的多檢索結果,考慮使用match;?
如果想盡可能精確的匹配分詞結果,考慮使用match_phrase;?
如果短語匹配的時候,怕遺漏,考慮使用match_phrase_prefix。

總結

以上是生活随笔為你收集整理的match_phrase搜不出来,怎么办?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。