查询数据 II

布尔查询

布尔查询是复合查询类(compound queris)的成员,允许混合多个term/query查询,提供逻辑来组合这些子句的匹配。布尔查询提供了对子句进行分组和混合的语法, 可以在must、should、must_not和should_not块中有多个子句。should查询是逻辑条件,而must查询是逻辑条件。

运行以下查询:

GET /my-movie-index/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "genres": "action"
          }
        },
        {
          "match": {
            "title": "matrix"
          }
        },
        {
          "match": {
            "actors": "reeves"
          }
        }
      ]
    }
  }
}

image-20240616162455851

这里有几点需要注意:

  1. 有426个搜索结果,其中至少有一个should匹配为true。
  2. 排在结果集顶部的文档是得分最高的。在这种情况下,该文档与所有3个should条件都匹配。
  3. 该系列中的其他电影被评为第二和第三,尽管它们也与所有条件匹配。在这种情况下,OpenSearch认为第一个文档的标题更接近所需的查询,因此得分更高。其他电影的得分几乎相同,但排名低于第一个。

OpenSearch使用一个默认的评分函数,称为Okapi BM25。这个函数(广义上是词频/逆文档频率,或TF/IDF)是统计性质的。Term的得分值与它们在整个语料库中的稀有程度成正比(IDF)。文档的得分是通过将匹配的术语得分乘以该术语在文档中出现的次数(TF)来计算的。

要了解某个特定文档为什么会得到它的得分,可以发起一个explain查询。最简单的方法是在搜索查询中添加explain=true,这样解释结果就会添加到返回的文档中(也可以在查询的JSON主体中添加["explain": "true"])。

GET /my-movie-index/_search?explain=true
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "genres": "action"
          }
        },
        {
          "match": {
            "title": "matrix"
          }
        },
        {
          "match": {
            "actors": "reeves"
          }
        }
      ]
    }
  }
}

image-20240616162922381

must查询

GET /my-movie-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "genres": "action"
          }
        },
        {
          "match": {
            "title": "matrix"
          }
        },
        {
          "match": {
            "actors": "reeves"
          }
        }
      ]
    }
  }
}

使用“should”关键字进行搜索会返回很多文档,而使用“must”关键字进行搜索只会返回满足所需条件的文档。使用“must”条件可以得到精确的结果:

image-20240616163316731

接下来,看看将must与should结合使用会发生什么:

GET /my-movie-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "actors": "reeves"
          }
        }
     ],
     "should": [
        {
          "match": {
            "title": "matrix"
          }
        },{
          "match": {
            "genres": "action"
          }
        }
      ]
    }
  }
}

在这里,定义了 actors 必须包含 reeves,但 title 和 types条件只要满足一个就行。结果是一个文档集,根据查询中所有条件的匹配程度对其进行评分(排名)

image-20240616163556743