组合字段
编辑组合字段编辑
combined_fields
查询支持将多个文本字段视为一个组合字段进行搜索。该查询以词语为中心:首先将查询字符串分析成单个词语,然后在所有字段中查找每个词语。当匹配可能跨越多个文本字段时,此查询特别有用,例如文章的 title
、abstract
和 body
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_fields
和 most_fields
以字段为中心。相反,combined_fields
以词语为中心:operator
和 minimum_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
模式也采用以词语为中心的方法,并针对每个词语应用 operator
和 minimum_should_match
。与 cross_fields
相比,combined_fields
的主要优势在于其基于 BM25F 算法的稳健且可解释的评分方法。