gpt4 book ai didi

Elasticsearch 数组评分

转载 作者:行者123 更新时间:2023-12-01 18:01:31 26 4
gpt4 key购买 nike

我正在使用 elasticsearch 搜索我的类型中的多个数组字段,看起来像这样

t1 =  { field1: ["foo", "bar"],
field2: ["foo", "foo", "foo", "foo"]
field3: ["foo", "foo", "foo", "foo", "foo", "foo"]
}

然后我使用 multi_match 查询来获取匹配项,等等

multi_match: { query: "foo",
fields: "fields*"
}

当计算t1的分数时,elasticsearch添加了field1、field2和field3中查询的分数,这就是我想要的。然而,它们的贡献并不相等,field3 对分数的贡献最大,因为“foo”在那里出现了多次。

我现在想通过不将所有数组条目的分数相加,而是仅取其中的最大值来计算每个数组字段中的分数。在我的示例中,包含的所有字段都将具有相同的分数,因为它们都有一个完全匹配。

这个问题已经在 elasticsearch forum 上提出过。 ,但至今尚未得到答复。

最佳答案

我自己也被这个问题难住了,似乎真的应该有一个简单的内置方法来指定 max 而不是 sum。

不确定这是否正是您想要的,因为您会丢失数组中任何特定项目的匹配分数。因此,您不会获得最佳特定项目的匹配分数的最大值,而只是获得一个 bool 值(如果有匹配项)。如果是更细微的内容(例如一个人的全名,您希望第一个和最后一个与仅一个或另一个更好匹配),这可能是 Not Acceptable ,因为您会放弃您的分数。

如果可以接受,则此解决方法似乎有效:

{function_score: {
query: {bool: {should: [
{term: {field1: 'foo'}},
{term: {field2: 'foo'}},
{term: {field3: 'foo'}},
]}},
functions: [
{filter: {term: {field1: 'foo'}}, weight: 1},
{filter: {term: {field2: 'foo'}}, weight: 1},
{filter: {term: {field2: 'foo'}}, weight: 1},
],
score_mode: 'sum',
boost_mode: 'replace',
}}

即使我们丢弃分数,我们也需要“查询”部分来为我们提供进一步过滤的结果。这看起来确实应该是一个过滤器,但仅仅将同样的东西包装在 filtered 查询中是行不通的。这里可能有更好的选择。

然后,如果该字段匹配,则权重函数基本上给出 1,否则给出 0。 score_mode 告诉它对这些权重求和,所以在你的情况下它们都匹配,所以我们得到 3。 boost_mode 告诉它如何与原始查询结合,“replace”告诉它忽略原始查询分数(这存在您提到的问题,即对数组中的多个匹配项进行求和)。因此,该查询的总分是 3,因为有 3 个匹配项。

这对我来说似乎更复杂,但在我相对有限的测试中,我没有注意到性能问题或任何问题。如果更熟悉elasticsearch的人有一个更好的答案,我很乐意看到一个更好的答案。

关于Elasticsearch 数组评分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25244287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com