本地英文版地址: ../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 重写方法。
其他方法都要计算相关性分数。这些分数的计算通常开销很大,并且不会改善查询结果。