Elasticsearch - 短語匹配(match_phrase)以及slop參數

短語匹配(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詞條。

Tip

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。

如果以上的任何一個條件沒有被滿足,那麼文檔就不能被匹配。

Tip

在內部,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

以上參考:https://www.elastic.co/guide/en/elasticsearch/guide/current/slop.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章