短語匹配(Phrase Matching)
就像用於全文搜索的的match查詢一樣,當你希望尋找鄰近的單詞時,match_phrase查詢可以幫你達到目的。
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": "quick brown fox"
}
}
}
和match查詢類似,match_phrase查詢首先解析查詢字符串來產生一個詞條列表。然後會搜索所有的詞條,但只保留包含了所有搜索詞條的文檔,並且詞條的位置要鄰接。一個針對短語quick fox的查詢不會匹配我們的任何文檔,因爲沒有文檔含有鄰接在一起的quick和fox詞條。
match_phrase查詢也可以寫成類型爲phrase的match查詢:
"match": {
"title": {
"query": "quick brown fox",
"type": "phrase"
}
}
GET /_analyze?analyzer=standard
Quick brown fox
返回如下:
{
"tokens": [
{
"token": "quick",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "brown",
"start_offset": 6,
"end_offset": 11,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "fox",
"start_offset": 12,
"end_offset": 15,
"type": "<ALPHANUM>",
"position": 3
}
]
}
位置信息可以被保存在倒排索引(Inverted Index)中,像match_phrase這樣位置感知(Position-aware)的查詢能夠使用位置信息來匹配那些含有正確單詞出現順序的文檔,且在這些單詞之間沒有插入別的單詞。
對於匹配了短語"quick brown fox"的文檔,下面的條件必須爲true:
- quick、brown和fox必須全部出現在某個字段中。
- brown的位置必須比quick的位置大1。
- fox的位置必須比quick的位置大2。
如果以上的任何一個條件沒有被滿足,那麼文檔就不能被匹配。
在內部,match_phrase查詢使用了低級的span查詢族(Query Family)來執行位置感知的查詢。span查詢是詞條級別的查詢,因此它們沒有解析階段(Analysis Phase);它們直接搜索精確的詞條。
幸運的是,大多數用戶幾乎不需要直接使用span查詢,因爲match_phrase查詢通常已經夠好了。但是,對於某些特別的字段,比如專利搜索(Patent Search),會使用這些低級查詢來執行擁有非常特別構造的位置搜索。
以上參考:https://www.elastic.co/guide/en/elasticsearch/guide/current/phrase-matching.html#phrase-matching
混合起來(Mixing it up)
精確短語(Exact-phrase)匹配也許太過於嚴格了。也許我們希望含有"quick brown fox"的文檔也能夠匹配"quick fox"查詢,即使位置並不是完全相等的。
我們可以在短語匹配使用slop參數來引入一些靈活性:
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": {
"query": "quick fox",
"slop": 1
}
}
}
}
slop參數告訴match_phrase查詢詞條能夠相隔多遠時仍然將文檔視爲匹配。相隔多遠的意思是,你需要移動一個詞條多少次來讓查詢和文檔匹配?
我們以一個簡單的例子來闡述這個概念。爲了讓查詢quick fox能夠匹配含有quick brown fox的文檔,我們需要slop的值爲1:
Pos 1 Pos 2 Pos 3
-----------------------------------------------
Doc: quick brown fox
-----------------------------------------------
Query: quick fox
Slop 1: quick ↳ fox
儘管在使用了slop的短語匹配中,所有的單詞都需要出現,但是單詞的出現順序可以不同。如果slop的值足夠大,那麼單詞的順序可以是任意的。
爲了讓fox quick查詢能夠匹配我們的文檔,需要slop的值爲3:
Pos 1 Pos 2 Pos 3
-----------------------------------------------
Doc: quick brown fox
-----------------------------------------------
Query: fox quick
Slop 1: fox|quick ↵
Slop 2: quick ↳ fox
Slop 3: quick ↳ fox