中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

elasticsearch的match_phrase_prefix查詢怎么使用

發布時間:2023-03-21 14:17:18 來源:億速云 閱讀:219 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“elasticsearch的match_phrase_prefix查詢怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“elasticsearch的match_phrase_prefix查詢怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

match_phrase

match_phrase_prefix可以認為是match_phrase的增強版本,所以先了解一下match_phrase。

match_phrase詞組匹配會先解析檢索詞,并且標注出每個的token相對位置,搜索匹配的字段的必須包含所有的檢索詞的token,并且他們的相對位置也要和檢索詞里面相同。

在《系統學習ElasticSearch》中,有很好的例子:

# DSL語句
GET /tehero_index/_doc/_search
{
  "query":{
    "match_phrase":{
      "content.ik_smart_analyzer":"系統編程"
    }
  }

DSL執行步驟分析:

1)檢索詞“系統編程”被分詞為兩個Token【系統,Position=0】【編程,Position=1】

2)倒排索引檢索時,等價于sql:【where Token = 系統 and 系統_Position=0 and Token = 編程 and 編程_Position=1】;

如果我們不要求這兩個單詞相鄰,希望放松一點條件,可以添加slop參數,slop代表兩個token之間相隔的最多的距離(最多需要移動多少次才能相鄰)。

match_phrase_prefix

與match_phrase查詢類似,但是會對最后一個Token在倒排序索引列表中進行通配符搜索。

# DSL語句
GET /tehero_index/_doc/_search
{
  "query":{
    "match_phrase":{
      "content.ik_smart_analyzer":"我編程系"
    }
  }

這個分詞的結果會是“我”、“編程”、“系”。

“我”和“編程”是精確匹配,“系”是前綴匹配,等價于sql:【where Token = ‘我’ and 我_Position=0 and Token = ‘編程’ and 編程_Position=1 and (Token_Position=2 and Token like ‘系%’)

需要注意的點

elasticsearch的官網文檔上,有match_phrase_prefix的完整參數結構:

elasticsearch的match_phrase_prefix查詢怎么使用

  • query,查詢的關鍵字

  • analyer,對關鍵字使用的分詞器

  • max_expansions最后一個term做前綴匹配時的最大拓展數,默認是50

  • slop,與match_phrase的slop相同,允許term之間的最大間隔

  • zero_terms_query,經過analyer解析后,沒有任何term時,不返回數據,還是返回全部數據。默認返回全部數據。

max_expansions是非常重要的一個參數,需要留意下,不然很容易出現與我們期望不符合的情況。

  • 在工作中,我試過使用match_phrase_prefix來匹配手機號,但是出現了一些奇怪的現象:

  • 測試的手機號是“123454688885555”,使用match_phrase_prefix,關鍵字是“12345”來查詢指定租戶下的數據,沒有返回任何文檔。把關鍵字換成“1234546”,正確返回了對應的文檔。

為什么會這樣呢?為什么12345就不返回,1234546就返回了?

個人是這樣覺得的:

  • 手機號雖然存在es中是字符串,但是字符串的內容是數字,分詞器并不會對它進行分詞,也就是一個手機號就是一個term

  • 在測試數據中,數據有5000條,每條數據的手機號碼都是不一樣的,也就是說,手機號這樣的term有5000個。

  • max_expansions默認是50,也就是說,會把12345拓展出以12345為開頭的額外50個term,例如123456、1234546、123456898…

  • 最后將拓展出來的term也用于查詢

為什么我會認為是這樣的過程呢?

elasticsearch除了會構建倒排索引之外,還會在所有的term構建一個term dictionary (詞典)和term index(詞索引,印象是跳躍表結構),幫助查找。

當出現前綴匹配的時候,可以在term index和term dictionary中快速找到對應開通的term。

根據max_expansions的值,拿到指定個數的term。

12345查不到數據,1234546能查找,明顯是1234546更精確,1234546拓展出來的term中包含了那個完整的手機號碼123454688885555。

在查詢這個參數相關的文章的時候,發現:

  • 有的人認為這個數值是值通配符,值是50,就能模糊匹配多關鍵字之后50的字符的term。有的人認為這個數值是匹配的文檔數,值是50,則匹配50個文檔,返回這50個文檔中命中的部分。

  • 這都是不對的,明顯與手機號的實驗不符。

  • 《系統學習ElasticSearch》中對max_expansions的描述就像是占位符。

讀到這里,這篇“elasticsearch的match_phrase_prefix查詢怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

延寿县| 织金县| 白山市| 曲麻莱县| 论坛| 马关县| 石楼县| 常山县| 台北市| 淮滨县| 祁连县| 定陶县| 大安市| 许昌市| 扎鲁特旗| 永新县| 庆阳市| 眉山市| 福州市| 探索| 堆龙德庆县| 佛教| 淮滨县| 吉隆县| 瓦房店市| 昌宁县| 保德县| 中牟县| 鹤山市| 德令哈市| 博乐市| 枣强县| 锡林浩特市| 秭归县| 三亚市| 临潭县| 剑川县| 城口县| 宁陵县| 黄山市| 湘西|