本地英文版地址: ../en/query-dsl-multi-term-rewrite.html
此参数仅供专业用户使用,更改此参数的值会影响搜索性能和相关性。
Elasticsearch 在内部使用Apache Lucene来支持索引和搜索。 在它们原始的形式中,Lucene 不能执行以下查询:
为了执行它们,Lucene 将这些查询转换成更简单的形式,比如bool
查询或位组(bit set)。
参数rewrite
决定了:
- Lucene 如何计算每个匹配文档的相关性分数
-
Lucene 是否将原始查询更改为
bool
查询或位组(bit set) -
如果更改为
bool
查询,将包括哪些term
查询子句
有效值
-
constant_score
(默认) -
对较少的匹配词项使用
constant_score_boolean
方法。 否则,该方法将按顺序查找所有匹配的词项,并使用一个位组(bit set)返回匹配的文档。 -
constant_score_boolean
-
为每个文档分配一个与
boost
参数相等的相关性分数。该方法将原始查询更改为
bool
查询。 这个bool
查询包含一个should
子句和针对每个匹配词项的term
查询。此方法会导致最终的
bool
查询超过indices.query.bool.max_clause_count
设置中的子句的数量限制。 如果查询超过这个限制,Elasticsearch 将返回一个错误。 -
scoring_boolean
-
计算每个匹配文档的相关性分数。
该方法将原始查询更改为
bool
查询。 这个bool
查询包含一个should
子句和针对每个匹配词项的term
查询。此方法会导致最终的
bool
查询超过indices.query.bool.max_clause_count
设置中的子句的数量限制。 如果查询超过这个限制,Elasticsearch 将返回一个错误。 -
top_terms_blended_freqs_N
-
计算每个匹配文档的相关性分数,就好像所有词项具有相同的频率一样。 这个频率是所有匹配词项的最大频率。
该方法将原始查询更改为
bool
查询。 这个bool
查询包含一个should
子句和针对每个匹配词项的term
查询。最终的
bool
查询仅包括对前N
个得分的词项的term
查询。可以使用此方法避免超出
indices.query.bool.max_clause_count
设置中的子句的数量限制。 -
top_terms_boost_N
-
为每个匹配文档分配一个与
boost
参数相等的相关性分数。该方法将原始查询更改为
bool
查询。 这个bool
查询包含一个should
子句和针对每个匹配词项的term
查询。最终的
bool
查询仅包括对前N
个得分的词项的term
查询。可以使用此方法避免超出
indices.query.bool.max_clause_count
设置中的子句的数量限制。 -
top_terms_N
-
计算每个匹配文档的相关性分数。
该方法将原始查询更改为
bool
查询。 这个bool
查询包含一个should
子句和针对每个匹配词项的term
查询。最终的
bool
查询仅包括对前N
个得分的词项的term
查询。可以使用此方法避免超出
indices.query.bool.max_clause_count
设置中的子句的数量限制。
rewrite
参数的性能考量
对于大多数使用场景,建议使用 constant_score
、constant_score_boolean
或 top_terms_boost_N
重写方法。
其他方法都要计算相关性分数。这些分数的计算通常开销很大,并且不会改善查询结果。