ElasticSearch – 根据字段值增强相关性
需要在ElasticSearch中find一种方法来提高基于字段特定值的文档的相关性。 具体而言,在我的所有文档中,字段值越高,包含该文档的文档的相关性应该越高,而不pipesearch结果如何。
考虑下面的文档结构:
{ "_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值更低的文档具有内在的相关性 。 这只是一个起点 – 在确定每个文档在search中的最终相关性分数时,也会考虑查询与其他字段之间的匹配。 但是, 其他条件相同的情况下,提升领域越高,文件就越相关 。
任何人有一个想法如何做到这一点?
非常感谢!
您可以在索引时间或查询时间进行提升。 我通常更喜欢查询时间提高,即使它使查询慢一点,否则我需要重新索引每当我想改变我的提升因素,这通常需要微调,需要非常灵活。
使用弹性search查询DSL应用查询时间提升有多种方法:
- 提高查询
- 自定义filter评分查询
- 自定义增强因子查询
- 自定义分数查询
前三个查询是有用的,如果你想给特定的提升匹配特定的查询或filter的文档。 例如,如果您只想提升上个月发布的文档。 你可以在你的boosting_field上使用这个方法,但是你需要手动定义一些boosting_field间隔,给他们一个不同的提升,这并不是很好。
最好的解决scheme是使用自定义分数查询 ,该查询允许您使用脚本进行查询并自定义分数。 这是相当强大的,脚本你可以直接修改分数本身。 首先,我会将boosting_field的值从0增加到1,这样你的最终分数就不会变成一个大数字。 为了做到这一点,你需要预测什么是或多或less的最小值和最大值的字段可以包含。 比方说最小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)。
你甚至可以调整结果,以便改变其重要性,增加一个权重,你用来影响分数的价值。 如果您需要将多个促进因素组合在一起,以便给予他们不同的权重,您将需要更多。
使用最新版本的Elasticsearch(版本1.3+),您将需要使用“function分数查询”:
得分的query_stringsearch如下所示:
{ 'query': { 'function_score': { 'query': { 'query_string': { 'query': 'my search terms' } }, 'functions': [{ 'field_value_factor': { 'field': 'my_boost' } }] } } }
“my_boost”是您的search索引中的一个数字字段,其中包含单个文档的增强因子。 可能看起来像这样:
{ "my_boost": { "type": "float", "index": "not_analyzed" } }
如果你想避免在查询内部进行每次提升,你可以考虑把它直接添加到你的映射中,并添加“boost:factor”。
所以你的映射可能看起来像这样:
{ "_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", "boost" : 10.0,} } }