1. 程式人生 > >Elasticsearch: 權威指南 » 深入搜尋 » 近似匹配 » 多值欄位

Elasticsearch: 權威指南 » 深入搜尋 » 近似匹配 » 多值欄位

多值欄位編輯

對多值欄位使用短語匹配時會發生奇怪的事。 想象一下你索引這個文件:

PUT /my_index/groups/1
{
    "names": [ "John Abraham", "Lincoln Smith"]
}

拷貝為 CURL在 SENSE 中檢視 

然後執行一個對 Abraham Lincoln 的短語查詢:

GET /my_index/groups/_search
{
    "query": {
        "match_phrase": {
            "names": "Abraham Lincoln"
        }
    }
}

拷貝為 CURL在 SENSE 中檢視 

令人驚訝的是, 即使 Abraham 和 Lincoln 在 names 數組裡屬於兩個不同的人名, 我們的文件也匹配了查詢。 這一切的原因在Elasticsearch陣列的索引方式。

在分析 John Abraham 的時候, 產生了如下資訊:

  • Position 1: john
  • Position 2: abraham

然後在分析 Lincoln Smith 的時候, 產生了:

  • Position 3: lincoln
  • Position 4: smith

換句話說, Elasticsearch對以上陣列分析生成了與分析單個字串 John Abraham Lincoln Smith 一樣幾乎完全相同的語彙單元。 我們的查詢示例尋找相鄰的 lincoln 和 abraham , 而且這兩個詞條確實存在,並且它們倆正好相鄰, 所以這個查詢匹配了。

幸運的是, 在這樣的情況下有一種叫做 position_increment_gap 的簡單的解決方案, 它在欄位對映中配置 。

DELETE /my_index/groups/ 
PUT /my_index/_mapping/groups { "properties": { "names": { "type": "string", "position_increment_gap": 100 } } }

拷貝為 CURL在 SENSE 中檢視 

首先刪除對映 groups 以及這個型別內的所有文件。

然後建立一個有正確值的新的對映 groups 。

position_increment_gap 設定告訴 Elasticsearch 應該為陣列中每個新元素增加當前詞條 position 的指定值。 所以現在當我們再索引 names 陣列時,會產生如下的結果:

  • Position 1: john
  • Position 2: abraham
  • Position 103: lincoln
  • Position 104: smith

現在我們的短語查詢可能無法匹配該文件因為 abraham 和 lincoln 之間的距離為 100 。 為了匹配這個文件你必須新增值為 100 的