Elasticsearch:匹配项和过滤器中的术语有什么区别?

时间:2019-11-06 07:54:08

标签: elasticsearch

我正在遵循ES教程,有时在过滤器中使用term编写了一个查询,而不是使用match的推荐解决方案。我的理解是,在查询部分使用match进行评分,而在term部分使用filter只是在进入查询部分之前删除匹配。令我惊讶的是,matchfilter部分中也起作用。

两者之间有什么区别

GET blogs/_search
{
  "query": {
    "bool": {
      "filter": {
        "match": {
          "category.keyword": "News"
        }
      }
    }
  }
}

和:

GET blogs/_search
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "category.keyword": "News"
        }
      }
    }
  }
}

两者均返回相同的匹配,所有匹配的得分均为0。

filter子句的行为或match是什么?我希望它能产生一些得分,但不会。

我的想法:

  • term:不分析参数或字段,这是yes/no方案。
  • match:分析参数和字段,并计算出它们的匹配程度得分。

但是当在查询的match部分中对keyword使用filter时,它的表现如何?

1 个答案:

答案 0 :(得分:1)

match查询是一个高级查询,如果需要,可以使用term查询。

计分与使用match而非term无关。使用bool/must/should instead of bool/filter时得分会提高。

match查询的工作方式如下:

首先,它检查字段的类型。

  • 如果它是text字段,则将使用查询中指定的分析器(如果有)或映射中指定的搜索时间或索引时间分析器来分析值。
  • 如果它是keyword字段(例如您的情况),则不会分析输入并按“原样”进行输入

由于您在match字段上使用keyword查询,并且您的输入是单个术语,因此不会分析任何内容,并且match查询将诉诸于使用{{1}在下面查询。这就是为什么您看到相同结果的原因。

通常,最好使用term查询,因为它足够聪明,可以根据给定的查询字段和要搜索的输入数据知道要做什么。

您可以详细了解两个here之间的区别。