组合字段编辑

combined_fields 查询支持将多个文本字段视为一个组合字段进行搜索。该查询以词语为中心:首先将查询字符串分析成单个词语,然后在所有字段中查找每个词语。当匹配可能跨越多个文本字段时,此查询特别有用,例如文章的 titleabstractbody

response = client.search(
  body: {
    query: {
      combined_fields: {
        query: 'database systems',
        fields: [
          'title',
          'abstract',
          'body'
        ],
        operator: 'and'
      }
    }
  }
)
puts response
GET /_search
{
  "query": {
    "combined_fields" : {
      "query":      "database systems",
      "fields":     [ "title", "abstract", "body"],
      "operator":   "and"
    }
  }
}

combined_fields 查询采用了一种基于简单 BM25F 公式的评分方法,该公式在 概率相关性框架:BM25 及其扩展 中进行了描述。在对匹配项进行评分时,查询会将跨字段的词语和集合统计信息结合起来,将每个匹配项的评分视为将指定字段索引到单个组合字段中。这种评分是最佳尝试;combined_fields 进行了一些近似处理,评分不会完全符合 BM25F 模型。

字段数量限制

默认情况下,查询中包含的子句数量有限制。此限制由 indices.query.bool.max_clause_count 设置定义,默认值为 4096。对于组合字段查询,子句数量的计算方法是字段数量乘以词语数量。

每个字段的提升编辑

字段提升根据组合字段模型进行解释。例如,如果 title 字段的提升值为 2,则评分的计算方式就好像标题中的每个词语在合成组合字段中出现了两次。

response = client.search(
  body: {
    query: {
      combined_fields: {
        query: 'distributed consensus',
        fields: [
          'title^2',
          'body'
        ]
      }
    }
  }
)
puts response
GET /_search
{
  "query": {
    "combined_fields" : {
      "query" : "distributed consensus",
      "fields" : [ "title^2", "body" ] 
    }
  }
}

可以使用插入符号 (^) 表示法对单个字段进行提升。

combined_fields 查询要求字段提升值大于或等于 1.0。字段提升值可以是小数。

combined_fields 的顶级参数编辑

fields
(必需,字符串数组) 要搜索的字段列表。允许使用字段通配符模式。仅支持 text 字段,并且它们必须具有相同的搜索 analyzer
query

(必需,字符串) 要在提供的 <fields> 中搜索的文本。

combined_fields 查询在执行搜索之前会 分析 提供的文本。

auto_generate_synonyms_phrase_query

(可选,布尔值) 如果为 true,则会自动为多词同义词创建 短语匹配 查询。默认值为 true

有关示例,请参见 在匹配查询中使用同义词

operator

(可选,字符串) 用于解释 query 值中文本的布尔逻辑。有效值为

or (默认)
例如,query 值为 database systems 将被解释为 database OR systems
and
例如,query 值为 database systems 将被解释为 database AND systems
minimum_should_match

(可选,字符串) 为了返回文档,必须匹配的子句的最小数量。有关有效值和更多信息,请参见 minimum_should_match 参数

zero_terms_query

(可选,字符串) 指示如果 analyzer 删除所有标记(例如,使用 stop 过滤器时),是否不返回任何文档。有效值为

none (默认)
如果 analyzer 删除所有标记,则不返回任何文档。
all
返回所有文档,类似于 match_all 查询。

有关示例,请参见 零词查询

multi_match 查询的比较编辑

combined_fields 查询提供了一种在多个 text 字段中进行匹配和评分的原则性方法。为了支持这一点,它要求所有字段具有相同的搜索 analyzer

如果您想要一个可以处理不同类型字段(如关键字或数字)的单个查询,那么 multi_match 查询可能更适合。它支持文本和非文本字段,并接受不共享相同分析器的文本字段。

主要的 multi_match 模式 best_fieldsmost_fields 以字段为中心。相反,combined_fields 以词语为中心:operatorminimum_should_match 是针对每个词语应用的,而不是针对每个字段应用的。具体来说,类似于以下的查询

response = client.search(
  body: {
    query: {
      combined_fields: {
        query: 'database systems',
        fields: [
          'title',
          'abstract'
        ],
        operator: 'and'
      }
    }
  }
)
puts response
GET /_search
{
  "query": {
    "combined_fields" : {
      "query":      "database systems",
      "fields":     [ "title", "abstract"],
      "operator":   "and"
    }
  }
}

将被执行为

+(combined("database", fields:["title" "abstract"]))
+(combined("systems", fields:["title", "abstract"]))

换句话说,每个词语必须至少存在于一个字段中,文档才能匹配。

cross_fields multi_match 模式也采用以词语为中心的方法,并针对每个词语应用 operatorminimum_should_match。与 cross_fields 相比,combined_fields 的主要优势在于其基于 BM25F 算法的稳健且可解释的评分方法。

自定义相似度

combined_fields 查询目前仅支持 BM25 相似度,除非配置了 自定义相似度,否则它是默认值。也不允许使用 每个字段的相似度。在这两种情况下使用 combined_fields 都会导致错误。