ES-布林查詢

741439599發表於2021-11-17

一個匹配文件的查詢,該文件與其他查詢的布林組合相匹配。bool查詢對映到Lucene BooleanQuery。它是用一個或多個布林子句構建的,每個子句都有一個型別出現。出現型別有:

Occur Description
must 該子句(查詢)必須出現在匹配的檔案中,並將影響評分。
filter 該子句(查詢)必須出現在匹配的文件中。然而,與must不同的是,查詢的分數將被忽略。過濾器子句在過濾器上下文中執行,這意味著評分將被忽略,子句將被考慮用於快取。
should 該子句(查詢)應該出現在匹配的文件中。
must_not 子句(查詢)不能出現在匹配的文件中。子句在過濾器上下文中執行,這意味著忽略評分,子句被考慮用於快取。因為忽略評分,所以返回所有文件的評分為0。

bool查詢採用“匹配越多越好”的方法,因此每個匹配must或should子句的分數將被加在一起,為每個文件提供最終的_score。

POST _search
{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "user.id" : "kimchy" }
      },
      "filter": {
        "term" : { "tags" : "production" }
      },
      "must_not" : {
        "range" : {
          "age" : { "gte" : 10, "lte" : 20 }
        }
      },
      "should" : [
        { "term" : { "tags" : "env1" } },
        { "term" : { "tags" : "deployed" } }
      ],
      "minimum_should_match" : 1,
      "boost" : 1.0
    }
  }
}

使用 minimum_should_match

可以使用minimum_should_match引數指定返回的文件必須匹配的should子句的數量或百分比。

如果bool查詢至少包含一個should子句,而沒有must或filter子句,則預設值為1。否則,預設值為0。

For other valid values, see the minimum_should_match parameter.

Scoring with bool.filter

在篩選器元素下指定的查詢對評分沒有影響——得分返回為0。分數只受指定的查詢的影響。例如,以下三個查詢都返回status欄位包含術語 active的所有文件。

第一個查詢為所有文件分配0分,因為沒有指定評分查詢:

GET _search
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

這個bool查詢有一個match_all查詢,它為所有文件賦值1.0

GET _search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

constant_score查詢的行為與上面的第二個示例完全相同。constant_score查詢為篩選器匹配的所有文件賦值1.0。

GET _search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

Name queries

每個查詢在其頂級定義中接受一個_name。您可以使用命名查詢來跟蹤哪些查詢與返回的文件匹配。如果使用命名查詢,則響應為每次命中都包含一個matched_queries屬性。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章