7

给定以下示例 solr 文档:

<doc>
  <field name="guid">1</field>
  <field name="name">Harry Potter</field>
  <field name="friends">ron</field>
  <field name="friends">hermione</field>
  <field name="friends">ginny</field>
  <field name="friends">dumbledore</field>
</doc>
<doc>
  <field name="guid">2</field>
  <field name="name">Ron Weasley</field>
  <field name="friends">harry</field>
  <field name="friends">hermione</field>
  <field name="friends">lavender</field>
</doc>
<doc>
  <field name="guid">3</field>
  <field name="name">Hermione Granger</field>
  <field name="friends">harry</field>
  <field name="friends">ron</field>
  <field name="friends">ginny</field>
  <field name="friends">dumbledore</field>
</doc>

和以下查询(或过滤查询):

friends:ron OR friends:hermione OR friends:ginny OR friends:dumbledore 

所有三个文档都将被返回,因为它们每个都有至少一个指定的朋友。

但是,我想为匹配的朋友数量设置一个最小(和最大)阈值。例如,仅返回具有至少 2 个但不超过 3 个指定好友的文档。

这样的查询只会返回第三个文档(Hermione Granger),因为她指定了 4 个朋友中的 3 个,而第一个(哈利波特)匹配所有 4 个,第二个(罗恩韦斯莱)只匹配 1 个。

这在 Solr 查询中是否可行?

4

2 回答 2

10

您需要使用函数 query ,termfreq并计算匹配的术语(在您的情况下称为“朋友”)的数量。您可以总结结果,然后使用 仅返回阈值内的文档frange,如下所示:

{!frange l=2 u=3}sum(termfreq(friends,'ron'),termfreq(friends,'hermione'),termfreq(friends,'ginny'),termfreq(friends,'dumbledore'))

termfreq(...)将为1找到的每个朋友返回,并且这些总和是您根据阈值(您在!frange语句开头指定的下限和上限)测试的结果。

您可以将其放置在q:字段或fq:字段中。这是在 Solr 管理面板中供您参考:

在此处输入图像描述

于 2013-05-14T16:23:22.113 回答
0

我能看到的最简单的方法就是添加一个“nbOfFriends”字段并将其填充到源或 UpdateProcessor 中。

如果您不想添加此附加字段,您可能会查看Joins,但我不确定它是否允许您查询连接中的子项数量,您应该检查一下。

于 2013-05-13T07:14:47.080 回答