rewrite 参数

此参数仅供专业用户使用,更改此参数的值会影响搜索性能和相关性。

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_scoreconstant_score_booleantop_terms_boost_N 重写方法。

其他方法都要计算相关性分数。这些分数的计算通常开销很大,并且不会改善查询结果。