当前位置: 首页 > 知识库问答 >
问题:

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值的文档更相关。这只是一个起点--在确定搜索中每个文档的最终相关性得分时,还将考虑查询与其他字段之间的匹配。但是,在其他条件相同的情况下,增强场越高,文档越相关。

有人知道怎么做吗?

多谢!

共有1个答案

陆伟
2023-03-14

您可以在html" target="_blank">索引时或查询时进行boost。我通常更喜欢查询时间提升,尽管它会使查询稍微慢一点,否则每次我想改变提升因子时都需要重新索引,这通常需要微调,并且需要非常灵活。

使用elasticsearch查询DSL应用查询时间提升有不同的方法:

  • 增强查询
  • 自定义筛选器得分查询
  • 自定义增强因子查询
  • 自定义分数查询

如果要对匹配特定查询或筛选器的文档进行特定的增强,则前三个查询非常有用。例如,如果您只想增强上个月发布的文档。您可以在boosting_field中使用这种方法,但您需要手动定义一些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作为boost因子(_score*而不是_score+),但是您需要将其缩放到最小值为1的间隔(只需添加+1)。

你甚至可以调整结果,以改变它的重要性,增加一个权重的值,你用它来影响分数。如果你需要把多个促进因素结合在一起,以便给它们不同的权重,你会更需要这个。

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

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

  • 作为参考,我使用的是Elasticsearch 6.4.0 我有一个Elasticsearch查询,它返回一定的命中视频数,我正在尝试删除文本字段值过于相似的命中。我的查询是: 此查询使用自定义函数分数和筛选器来返回用户可能喜欢的书籍(他们尚未创作的书籍)。对于某些人来说,它返回的名字非常相似的书(即乔治·华盛顿的一生,乔治·华盛顿的美好时光,谁是乔治·华盛顿),我希望热门歌曲有一套更多样化的名字

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

  • 我已经设置了4个阶段多个相关的下拉字段。我想选择地区,然后是国家,拥有或特许经营,最后是商店名称。 我的问题:1)显示/隐藏工作正常,但在选择“-”时不会重置值。这意味着我可以选择一个商店,然后改变我的观点,从上面的字段类别中选择另一个选项,然后选择第二个商店。该帖子将同时具有这两个值。我想在选择其他选项时重置第一个值 2)店名具有所有名称属性store_name。当我使用implode()时,我

  • 我有以下查询 http://172.22.23.169:9200/index1,index2,index3/_search?pretty 使用这个URL,我想查询Elasticsearch中的许多索引,并且只返回那些存在特定字段的文档。 是否可以在“exists”子句中放入一个字段列表,我在其中定义“field1”、“field2”或“fiedl3”是否存在于某个文档中,否则返回它,或者我必须编写