当前位置: 首页 > 面试题库 >

ElasticSearch —基于字段值提高相关性

翟渝
2023-03-14
问题内容

需要在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)即可。

您甚至可以调整结果,以便更改其重要性,从而增加权重以影响分数。如果您需要将多个增强因子组合在一起以赋予它们不同的权重,则将需要更多。



 类似资料:
  • 需要在ElasticSearch中找到一种方法,以基于某个字段的特定值来提高文档的相关性。具体地说,在我的所有文档中都有一个特殊的字段,该字段值越高,包含该字段的文档就越相关,无论搜索如何。 考虑以下文档结构: 我希望具有较高boosting_field值的文档在本质上比具有较低boosting_field值的文档更相关。这只是一个起点--在确定搜索中每个文档的最终相关性得分时,还将考虑查询与其他

  • 我试图通过根据场值提升_score来摆脱弹性搜索中的排序。这是我的场景: 我的文档中有一个字段:应用日期。这是自EPOC以来经过的时间。我希望具有更大应用日期(最近)的记录具有更高的分数。 如果两个文档的分数相同,我想在另一个字符串类型的字段上对它们进行排序。说“状态”是另一个可以有值的字段(可用、进行中、关闭)。所以,具有相同应用程序日期的文档应该根据状态_score。可用应该有更多的分数,进行

  • 我有一个弹性搜索映射,包含一个语言代码的字段,如EN、DE、ES、FR等。如果用户开始用英语搜索,我想在搜索结果中增加所有英语文档;法语、西班牙语、德语等也一样。 我想,应该这样做: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html#function

  • 问题内容: 我有一个MySQL表和模型包含的字段,以及。我也有另一个表/模型也包含,和。 假设已经充满了桌子,和。 当我以表格形式输入数据时,当我选择与表格相关的“ 通过”下拉字段时,我希望相关和字段能够自动填写。 我的for 看起来像这样: 根据建议,在控制器中添加了以下内容: 问题答案: 您所需要的只是调用请求以获取必填字段。就像下面这样: (我不知道您的型号名称)查看您的表格,看看您的字段是

  • 使用fuglede的答案,很容易找到数据帧列的局部极值: 它给出了以下图表: 我现在想把这些极值成对分组(最小值) 有没有一种优雅而快速的方法可以做到这一点?

  • elasticSearch搜索:比如,我有一个关键字是“北京地铁”,但是我只想搜索挨着的关键词,比如搜索【北京】或者搜索【地铁】或者在搜索【北京地铁】这种的可以保证能匹配到,但是如果隔词搜索就不让他显示出来,比如:【北地】,【京铁】,这种隔词了,就不让搜索出来如何处理,不采用match_phrase的方法,还有没有更加高效的方法? 我尝试过使用match_phrase可以做到我要的结果,但是mat