Solr:将OR查询中的匹配数过滤到多值字段

时间:2013-05-10 18:46:44

标签: solr

给出以下示例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个,而第二个(Ron Weasley)只匹配1个。

这在Solr查询中是否可行?

2 个答案:

答案 0 :(得分:7)

您需要使用function querytermfreq,并计算匹配的术语数量(在您的情况下也称为“朋友”)。您可以使用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管理面板中供您参考:

enter image description here

答案 1 :(得分:0)

我能看到的最简单的方法就是添加一个'nbOfFriends'字段并在源代码或UpdateProcessor中填充它。

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