我想知道,使用“術語集”查詢,為什么當minimum_should_match_field指定的欄位具有值“0”時,它的行為就像它具有值“1”一樣。
為了重現這個問題,我以Elasticsearch 檔案中的示例為例,并構建了以下三個步驟。
步驟1:
創建新索引
PUT /job-candidates
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"programming_languages": {
"type": "keyword"
},
"required_matches": {
"type": "long"
}
}
}
}
第2步:
創建兩個檔案, required_matches 設定為零
PUT /job-candidates/_doc/1?refresh
{
"name": "Jane",
"programming_languages": [ "c ", "java" ],
"required_matches": 0
}
并且
PUT /job-candidates/_doc/1?refresh
{
"name": "Ben",
"programming_languages": [ "python" ],
"required_matches": 0
}
第 3 步:
使用以下搜索搜索檔案
GET /job-candidates/_search
{
"query": {
"terms_set": {
"programming_languages": {
"terms": [ "c ", "java"],
"minimum_should_match_field": "required_matches"
}
}
}
}
預期結果:我希望第 3 步同時回傳檔案“Jane”和“Ben”
實際結果:但它只回傳檔案“Jane”
我不明白。如果minimum_should_match為 0,是否意味著回傳的檔案不需要匹配任何術語,因此也應該回傳“Ben”檔案?
我找到了一些鏈接,但仍然無法回答我的問題:
- minimum_should_match
- 看起來minimum_should_match不能不為零,但是如果它確實為零或大于可選值的數量,它并沒有說明搜索如何作業。
- 討論minimum_should_match的默認值
- 但他們沒有特別討論“術語集”查詢。
任何澄清將不勝感激!謝謝。
uj5u.com熱心網友回復:
查看terms_set源代碼時,我們可以看到正在使用的底層 Lucene 查詢被呼叫CoveringQuery。
所以解釋可以在 Lucene's source code of 中找到CoveringQuery,其檔案說
每個檔案的長值,記錄應該匹配多少查詢。小于 1 的值被視為
1:只有具有至少一個匹配子句的檔案才會被視為匹配。沒有值的檔案minimumNumberMatch不匹配。
而遠一點,代碼,設定minimumNumberMatch是不言自明:
final long minimumNumberMatch = Math.max(1, minMatchValues.longValue());
我們可以簡單地總結一下:發送terms_set查詢實際上沒有意義,minimum_should_match: 0因為它等同于match_all查詢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/395431.html
標籤:弹性搜索
下一篇:如何為容器安裝其他依賴項?
