【问题标题】:Elasticsearch limit score impact of multi-match query多匹配查询的 Elasticsearch 限制分数影响
【发布时间】:2020-06-14 16:17:44
【问题描述】:

我有一个匹配五个不同字段的多重匹配查询。我想限制这个多重匹配查询对整体查询的影响,这样如果由于某种原因,其中一个字段刚刚被搜索词发送到垃圾邮件,它就不会得到很大的分数.我想要的是一种衰减的影响。我已经浏览了文档,我正在努力寻找一种方法来做到这一点。我找到了衰减脚本函数文档 (https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/function-score-query-usage.html),但它们似乎都特定于单个字段,这对我没有帮助,因为我想将它应用于多匹配查询。

这是我想限制影响的查询:

new MultiMatchQuery
{
    Type = TextQueryType.MostFields,
    Fields = Field<SearchableTour>(f => f.Name, 0.5)
        .And(Field<SearchableTour>(f => f.StartCity, 0.1))
        .And(Field<SearchableTour>(f => f.FinishCity, 0.1))
        .And(Field<SearchableTour>(f => f.Description, 0.05))
        .And(Field<SearchableTour>(f => f.ItineraryText, 0.01)),
    Query = searchText,
    Operator = Operator.And
}

基础数据不受我控制,理论上有人可以用常见的搜索词填充其中一个字段,以人为地将其结果提升到顶部。我想阻止这种情况,但仍然允许这些字段产生有限的影响。似乎没有任何“最高分数”的概念可以让我限制这些字段的组合分数。

【问题讨论】:

    标签: c# elasticsearch nest elasticsearch-query


    【解决方案1】:

    我认为你走在正确的道路上。您应该能够将 MultiMatchQuery 插入您提供的链接的查询部分,然后提供您想要的任何分数函数。但请注意,提供的衰减函数适用于数字、日期或 geo_location 字段,因此您可能无法使用它们。我可能会做的是这样的:

    new FunctionScoreQuery()
    {
        Query = new MultiMatchQuery{ ... },
        ScoreMode = FunctionScoreMode.Sum,
        Functions = new List<IScoreFunction>
        {
            new ScriptScoreFunction { Script = new InlineScript(##YourDecayFunction(_score)##) }
        }
    }
    

    【讨论】:

    • 谢谢!知道我应该使用什么样的公式吗?我试过这个 - stackoverflow.com/a/55502327/5392786 - 但后来我收到错误消息,告诉我我的分数是负数。
    • 由于您没有最大值,这些衰减函数可能不起作用。也许只是一个简单的日志函数就可以了(请记住,您必须处理零到一之间的分数)?总的来说,我认为重要的是要记住分值是相对的。例如,如果您的最佳匹配得分为 1,则在 0 和 5 之间进行标准化是没有意义的,甚至是危险的!就我个人而言,我会考虑与boosts 合作以限制这些字段可能产生的影响。
    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多