【问题标题】:Using multi-layer queries in Solr在 Solr 中使用多层查询
【发布时间】:2019-05-25 10:11:03
【问题描述】:

Solr "qf" 参数的工作原理如下:

假设我有:query = "sid"qf = [field1, field1_edge, field2, field2_edge]

Solr 分数计算如下:

max(f1, f1_e, f2, f2_e) + tie * (sum of other 3 fields) 其中:"tie" lies in [0,1]

让我们致电:winner1 = field with max(f1, f1_e)winner2 = field with max(f2, f2_e)

我想对 Solr 中的给定查询进行如下评分:

score1 = winner1_score + tie_1 * loser1_score
score2 = winner2_score + tie_1 * loser2_score

final score = score1 + tie_2 * score2

实际上,我想在两层中应用qf(采用 tie_1 = 0 和 tie_2 = 1)。我有什么选择来实现这种相关性的想法?我认为“qf”参数和功能提升都不支持这一点。 谢谢!

【问题讨论】:

  • 您是在问如何使用为每个字段计算的单独分数,或者如何将max() 函数与值一起使用(存储在名为field1_score 的字段中,等等。 ) 从多个预定义字段作为分数?
  • @MatsLindh 基本上,我有兴趣使用不同字段的分数在离散的步骤中比较它们。例如,在第 1 步中,我想比较特定 field 的 2 种不同形式的分数,并决定要考虑哪一种。在第 2 步中,我想对不同领域的第 1 步的获胜者进行比较。
  • 但是每个字段的分数应该使用正常评分计算吗?这是否类似于使用dismaxedismax 查询解析器? (创建分离查询并使用每个子查询的最大值作为查询的分数)
  • 是的,每个字段都使用 DisMax 或 eDisMax 解析器中的任何一个使用正常评分进行评分。我想创建分离查询并多次从每个子查询中获取最大值。
  • 我看不出区别 - max(s1, s2) 与 max(field1_score, field1_edge_score, field2_score, score_field2_edge_score) 相同,这与从每个子查询中获取最大值相同,不是吗?而且“多次取最大值”仍然是相同的最大值,不是吗?您能否添加示例来显示您想要的与 dismax 查询解析器提供的内容不同的内容,以及您希望在示例中对查询进行评分的正确示例?

标签: search solr lucene full-text-search relevance


【解决方案1】:

在我看来,这样做的方法是使用query 函数,它允许您将函数应用于查询。 您将其与嵌套查询解析器结合使用,允许您运行多个 dismax 查询。

您可以这样做(根据您的需要设置tie1tie2):

q=_val_:"add(query($qq1),product(query($qq2),${tie2}))"
qq1={!edismax qf='field1 field1_edge' v='sid' tie=${tie1}}
qq2={!edismax qf='field2 field2_edge' v='sid' tie=${tie1}}
tie1=0.5
tie2=0.3

如果您使用 Solr 7.2(或更高版本),您还需要设置 uf=_query_ * 以使 _val_ 挂钩起作用。

PS:应该可以(虽然我还没有测试过)将q 的内容移动到qf 参数中,这样您就不必使用_val_ 挂钩:

qf=add(query($qq1),product(query($qq2),${tie2}))

【讨论】:

  • 这是一个很好的答案,并且按照 solr 6.6 下的广告工作。请注意,将函数直接放在 qf 字段中对我不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
相关资源
最近更新 更多