需要在ElasticSearch中找到一种方法来根据字段的特定值来提高文档的相关性。具体来说,我所有文档中都有一个特殊字段,该字段值越高,包含该文档的文档就越相关,而与搜索无关。
考虑以下文档结构:
{ "_all" : {"enabled" : "true"}, "properties" : { "_id": {"type" : "string", "store" : "yes", "index" : "not_analyzed"}, "first_name": {"type" : "string", "store" : "yes", "index" : "yes"}, "last_name": {"type" : "string", "store" : "yes", "index" : "yes"}, "boosting_field": {"type" : "integer", "store" : "yes", "index" : "yes"} } }
我希望boosting_field值较高的文档与那些boosting_field值较低的文档 本质上相关性 更高。这只是一个起点- 在确定搜索中每个文档的最终相关性分数时,还将考虑查询与其他字段之间的匹配。但是,在 所有其他条件相同的情况下,助推字段越高,文档越相关 。
有人对此有想法吗?
非常感谢!
您可以在索引时间或查询时间进行增强。我通常更喜欢查询时间提升,即使它会使查询变慢一点,否则每次我想更改提升因子时都需要重新编制索引,这通常需要进行微调并且必须非常灵活。
使用Elasticsearch查询DSL可以采用多种方法来增加查询时间:
如果要对与特定查询或过滤器匹配的文档进行特定的增强,则前三个查询很有用。例如,如果您只想增加上个月发布的文档。您可以将这种方法与boosting_field一起使用,但是您需要手动定义一些boosting_field间隔,并为它们提供不同的增强,但这并不是很好。
最好的解决方案是使用“ 自定义分数查询”,该查询使您可以使用脚本进行查询并自定义其分数。它非常强大,您可以使用脚本直接修改比分本身。首先,我将boosting_field的值缩放为例如0到1的值,这样您的最终分数就不会太大。为此,您需要预测字段可以包含的最小值或最大值。例如,假设最小值为0,最大值为100000。如果将boosting_field值缩放为介于0和1之间的数字,则可以将结果添加到实际分数中,如下所示:
{ "query" : { "custom_score" : { "query" : { "match_all" : {} }, "script" : "_score + (1 * doc.boosting_field.doubleValue / 100000)" } } }
您也可以考虑将boosting_field用作提升因子(_score *而不是_score +),但随后需要将其缩放到最小值为1的间隔(只需加上+1)即可。
_score *
_score +
您甚至可以调整结果,以便更改其重要性,从而增加权重以影响分数。如果您需要将多个增强因子组合在一起以赋予它们不同的权重,则将需要更多。