一,問題的表現
當我們在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
匹配的文件,必須滿足以下這些要求:
quick
、brown
和fox
需要全部出現在域中。brown
的位置應該比quick
的位置大1
。fox
的位置應該比quick
的位置大2
。
如果以上任何一個選項不成立,則該文件不能認定為匹配。
三,php中應用match_phrase
注意此處指定analyzer,因為是要與建立索引時使用的分詞器保持一致,
避免導致結果不準確
info是要搜尋的欄位名
$key是使用者輸入的關鍵詞
$infoWhere = ['match_phrase' => ['info' => ['query'=>$key,'analyzer' => 'ik_max_word']]];
$mustWhere[] = $infoWhere;