2013-05-10 59 views
4

已知以下的solr文件:Solr的:过滤在OR查询的匹配的多值字段中的数字

<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个指定好友的文档。

这样的查询将只返回第三文件(赫敏),因为她的指定的4位朋友3,而第(哈利·波特)匹配所有4和第2(罗恩)只有1

匹配

Solr查询可能吗?

回答

6

你会想要使用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

+0

正是我在找什么。谢谢! – jiffybank 2013-05-14 16:39:47

+0

你知道'termfreq' fq中使用通配符的方法吗?所以你可以使用'termfreq(文本,管理*)'来匹配“经理”,“管理”和“管理”? – 2015-02-06 22:59:09

0

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

如果你不想添加这个额外的字段,你可能看看Joins,但我不确定它是否允许你查询一个连接中的孩子数量,你应该检查。

+0

感谢您的回复。不幸的是,这并不像一个朋友总数那么简单。我需要匹配在查询中指定的朋友的数量,这将是动态的。另外,我没有立即看到联接如何提供帮助。 – jiffybank 2013-05-13 19:25:45