2013-05-10 100 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