es: match_phrase短語匹配

刘宏缔的架构森林發表於2024-10-09

一,問題的表現

當我們在es的索引庫中搜尋 朝陽新城 時,搜尋結果中有包含 朝陽新城 這四個字的結果,也有隻包含朝陽或只包含新城的結果,
這是analyzer在對關鍵詞做了分詞之後從索引庫中返回,
如果說:我只想要包含朝陽新城這四個字的結果,需要怎麼做?

二,解決:

1,預設的match搜尋會對搜尋內容進行分詞,比如:mill lane 會分成 mill 和 lane 之後搜尋的結果可能包含僅有其中一項的結果,但是此類結果分數較低。
如果不希望被分詞而是直接查詢短語,可以使用 match_phrase 進行搜尋

就像 match 查詢對於標準全文檢索是一種最常用的查詢一樣,
當你想找到彼此鄰近搜尋詞的查詢方法時,就會想到 match_phrase 查詢

例子:

GET /my_index/my_type/_search
{
    "query": {
        "match_phrase": {
            "title": "quick brown fox"
        }
    }
}

match_phrase 查詢首先將查詢字串解析成一個詞項列表,然後對這些詞項進行搜尋,
但只保留那些包含 全部 搜尋詞項,且 位置 與搜尋詞項相同的文件。
比如對於 quick fox 的短語搜尋可能不會匹配到任何文件,因為沒有文件包含的 quick 詞之後緊跟著 fox

2,什麼是短語匹配?

一個被認定為和短語 quick brown fox 匹配的文件,必須滿足以下這些要求:

  • quickbrownfox 需要全部出現在域中。
  • brown 的位置應該比 quick 的位置大 1
  • fox 的位置應該比 quick 的位置大 2

如果以上任何一個選項不成立,則該文件不能認定為匹配。

三,php中應用match_phrase

注意此處指定analyzer,因為是要與建立索引時使用的分詞器保持一致,
避免導致結果不準確
info是要搜尋的欄位名
$key是使用者輸入的關鍵詞

                $infoWhere = ['match_phrase' => ['info' => ['query'=>$key,'analyzer' => 'ik_max_word']]];
                $mustWhere[] = $infoWhere;

相關文章