需要在 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来应用查询时间提升有多种不同的方法:
- 增强查询 http://www.elasticsearch.org/guide/reference/query-dsl/boosting-query.html
- 自定义过滤器分数查询 http://www.elasticsearch.org/guide/reference/query-dsl/custom-filters-score-query.html
- 自定义提升因子查询 http://www.elasticsearch.org/guide/reference/query-dsl/custom-boost-factor-query.html
- 自定义分数查询 http://www.elasticsearch.org/guide/reference/query-dsl/custom-score-query.html
如果您想对与特定查询或过滤器匹配的文档进行特定提升,前三个查询非常有用。例如,如果您只想提升上个月发布的文档。您可以在 boosting_field 中使用这种方法,但是您需要手动定义一些 boosting_field 间隔并给它们不同的提升,这并不是很好。
最好的解决方案是使用自定义分数查询 http://www.elasticsearch.org/guide/reference/query-dsl/custom-score-query.html,它允许您使用脚本进行查询并自定义其分数。功能相当强大,通过脚本可以直接修改乐谱本身。首先,我会将 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)。
您甚至可以调整结果,以改变其重要性,为您用来影响分数的值添加权重。如果您需要将多个提升因素组合在一起以便赋予它们不同的权重,您将更需要这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)