Elasticsearch: 權威指南 » 深入搜尋 » 近似匹配 » 多值欄位
阿新 • • 發佈:2019-07-29
多值欄位編輯
對多值欄位使用短語匹配時會發生奇怪的事。 想象一下你索引這個文件:
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 中檢視
首先刪除對映 |
|
然後建立一個有正確值的新的對映 |
position_increment_gap
設定告訴 Elasticsearch 應該為陣列中每個新元素增加當前詞條 position
的指定值。 所以現在當我們再索引 names 陣列時,會產生如下的結果:
- Position 1:
john
- Position 2:
abraham
- Position 103:
lincoln
- Position 104:
smith
現在我們的短語查詢可能無法匹配該文件因為 abraham
和 lincoln
之間的距離為 100 。 為了匹配這個文件你必須新增值為 100 的