最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于elasticsearch的match_phrase_prefix查詢詳解

 更新時間:2023年03月21日 10:09:28   作者:自東向西  
這篇文章主要介紹了關(guān)于elasticsearch的match_phrase_prefix查詢問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

match_phrase

match_phrase_prefix可以認(rèn)為是match_phrase的增強(qiáng)版本,所以先了解一下match_phrase。

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

在《系統(tǒng)學(xué)習(xí)ElasticSearch》中,有很好的例子:

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

DSL執(zhí)行步驟分析:

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

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

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

match_phrase_prefix

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

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

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

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

需要注意的點(diǎn)

elasticsearch的官網(wǎng)文檔上,有match_phrase_prefix的完整參數(shù)結(jié)構(gòu):

  • query,查詢的關(guān)鍵字
  • analyer,對關(guān)鍵字使用的分詞器
  • max_expansions,最后一個term做前綴匹配時的最大拓展數(shù),默認(rèn)是50
  • slop,與match_phrase的slop相同,允許term之間的最大間隔
  • zero_terms_query,經(jīng)過analyer解析后,沒有任何term時,不返回?cái)?shù)據(jù),還是返回全部數(shù)據(jù)。默認(rèn)返回全部數(shù)據(jù)。

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

  • 在工作中,我試過使用match_phrase_prefix來匹配手機(jī)號,但是出現(xiàn)了一些奇怪的現(xiàn)象:
  • 測試的手機(jī)號是“123454688885555”,使用match_phrase_prefix,關(guān)鍵字是“12345”來查詢指定租戶下的數(shù)據(jù),沒有返回任何文檔。把關(guān)鍵字換成“1234546”,正確返回了對應(yīng)的文檔。

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

個人是這樣覺得的:

  • 手機(jī)號雖然存在es中是字符串,但是字符串的內(nèi)容是數(shù)字,分詞器并不會對它進(jìn)行分詞,也就是一個手機(jī)號就是一個term
  • 在測試數(shù)據(jù)中,數(shù)據(jù)有5000條,每條數(shù)據(jù)的手機(jī)號碼都是不一樣的,也就是說,手機(jī)號這樣的term有5000個。
  • max_expansions默認(rèn)是50,也就是說,會把12345拓展出以12345為開頭的額外50個term,例如123456、1234546、123456898…
  • 最后將拓展出來的term也用于查詢

為什么我會認(rèn)為是這樣的過程呢?

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

當(dāng)出現(xiàn)前綴匹配的時候,可以在term index和term dictionary中快速找到對應(yīng)開通的term。

根據(jù)max_expansions的值,拿到指定個數(shù)的term。

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

在查詢這個參數(shù)相關(guān)的文章的時候,發(fā)現(xiàn):

  • 有的人認(rèn)為這個數(shù)值是值通配符,值是50,就能模糊匹配多關(guān)鍵字之后50的字符的term。有的人認(rèn)為這個數(shù)值是匹配的文檔數(shù),值是50,則匹配50個文檔,返回這50個文檔中命中的部分。
  • 這都是不對的,明顯與手機(jī)號的實(shí)驗(yàn)不符。
  • 《系統(tǒng)學(xué)習(xí)ElasticSearch》中對max_expansions的描述就像是占位符…

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mybatis-plus如何使用mapper的xml

    mybatis-plus如何使用mapper的xml

    這篇文章主要介紹了mybatis-plus如何使用mapper的xml問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java字符串拼接的五種方法及性能比較分析(從執(zhí)行100次到90萬次)

    Java字符串拼接的五種方法及性能比較分析(從執(zhí)行100次到90萬次)

    字符串拼接一般使用“+”,但是“+”不能滿足大批量數(shù)據(jù)的處理,Java中有以下五種方法處理字符串拼接及性能比較分析,感興趣的可以了解一下
    2021-12-12
  • 解決Idea報(bào)錯There is not enough memory to perform the requested operation問題

    解決Idea報(bào)錯There is not enough memory 

    在使用Idea開發(fā)過程中,可能會遇到因內(nèi)存不足導(dǎo)致的閃退問題,出現(xiàn)"There is not enough memory to perform the requested operation"錯誤時,可以通過調(diào)整Idea的虛擬機(jī)選項(xiàng)來解決,方法是在Idea的Help菜單中選擇Edit Custom VM Options
    2024-11-11
  • SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法

    SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法

    本篇文章主要介紹了SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Java里的static import使用小結(jié)

    Java里的static import使用小結(jié)

    這篇文章主要介紹了Java里的static import使用小結(jié),本文給出了一些使用示例,并總結(jié)了一些使用特性,需要的朋友可以參考下
    2015-06-06
  • 記錄jdk21連接SQLServer因?yàn)門LS協(xié)議報(bào)錯問題

    記錄jdk21連接SQLServer因?yàn)門LS協(xié)議報(bào)錯問題

    在使用Druid連接池連接SQL Server時,可能會遇到因TLS版本不匹配導(dǎo)致的連接失敗問題,具體表現(xiàn)為客戶端使用TLS1.3或TLS1.2,而SQL Server僅支持TLS1.0,導(dǎo)致無法建立安全連接,解決方法是修改JDK的安全配置,啟用TLS1.0
    2024-10-10
  • 深入探究Java線程的狀態(tài)與生命周期

    深入探究Java線程的狀態(tài)與生命周期

    在java中,任何對象都要有生命周期,線程也不例外,它也有自己的生命周期。線程的整個生命周期可以分為5個階段,分別是新建狀態(tài)、就緒狀態(tài)、運(yùn)行狀態(tài)、阻塞狀態(tài)和死亡狀態(tài)
    2022-04-04
  • Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法

    Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法

    這篇文章主要介紹了Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • spring-Kafka中的@KafkaListener深入源碼解讀

    spring-Kafka中的@KafkaListener深入源碼解讀

    本文主要通過深入了解源碼,梳理從spring啟動到真正監(jiān)聽kafka消息的這套流程,從spring啟動開始處理@KafkaListener,本文結(jié)合實(shí)例流程圖給大家講解的非常詳細(xì),需要的朋友參考下
    2023-02-02
  • 深入理解Spring注解@Async解決異步調(diào)用問題

    深入理解Spring注解@Async解決異步調(diào)用問題

    這篇文章主要介紹了深入理解Spring注解@Async解決異步調(diào)用問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評論

永春县| 旺苍县| 三都| 澄江县| 普兰店市| 化德县| 南漳县| 扶风县| 喀喇| 合阳县| 天气| 恩平市| 郴州市| 巩留县| 祁连县| 永福县| 绥中县| 兴业县| 阿尔山市| 禹城市| 澎湖县| 涡阳县| 麻江县| 岱山县| 芜湖市| 临清市| 双流县| 尖扎县| 德令哈市| 准格尔旗| 旺苍县| 永德县| 隆安县| 垦利县| 石河子市| 甘洛县| 白河县| 巍山| 繁昌县| 休宁县| 视频|