2011-04-28 80 views
3

我正在嘗試查看是否可以自定義solr以更改搜索特定字段的方式。自定義Solr如何搜索特定字段

爲了更好地瞭解情況和問題,這是我想做的事 - 我有5場,他們都將是文本字段[不要過分解讀語法..]

<field>a</field> ==> will contain normal text [lazy fox jumps over ..] 
<field>b</field> ==> will contain normal text [lazy fox jumps over ..] 
<field>c</field> ==> will contain numbers separated by a delimiter [1, 2, 4, 6] 
<field>d</field> ==> will contain numbers separated by a delimiter [1, 2, 4, 6] 
<field>e</field> ==> will contain numbers separated by a delimiter [1, 2, 4, 6] 

我的查詢將針對所有這5個字段進行搜索,並且字段c,d的值爲&e也將包含用逗號分隔的數值。

搜索時我想執行查詢中值的相交&該字段在索引中的值。我怎樣才能做到這一點?

=>查看問題的另一種方式是,如果查詢字段中的某個值存在於索引內的字段中,那麼我應匹配此文檔以返回。這看起來像一個簡單的「OR」搜索,但每個字段內的值可能是100的順序..所以構建一個或許查詢許多可能的輸入值不會是我猜。如果這能夠很好地擴展,那麼這可能是一個可能的解決方案,但不確定它是否能夠很好地擴展。

我該如何實現這樣的定製? - 搜索/查詢性能是一個將要考慮的關鍵因素。

回答

0

對於字段c d和e,您應該用分隔符分隔值,並將其存儲爲多值字段,這樣可以使您匹配每個單個值。

所以你的查詢變得

q=a:(query) b:(query) c:(query) d:(query) e:(query) 

假設默認查詢運算符是OR。

+0

默認查詢運算符僅適用於字段之間的正確嗎?即,在a,b,c,d和e之間。 你能指定一個默認的查詢操作符跨越不同的字段和每個字段嗎? - 另一種方法是設置默認值爲OR,並在查詢中明確指定AND。 – karthik 2011-04-29 16:45:16

+0

不,默認的操作符將在任何空格分隔的條件下工作,除非我們通過用引號括起來使它們成爲短語。 – Umar 2011-04-30 07:54:45

-1

您可以使用copyField選項。用某個名稱創建一些字段,例如'composite'。

<field name="composite" type="sometype" indexed="true" stored="false" multiValued="true"> 

設置存儲選項爲false以避免過多的內存使用。

與c d相同的類型& e。將c字段& e字段複製到'composite'

<copyField source="c" dest="composite"> 

<copyField source="d" dest="composite"> 

<copyField source="e" dest="composite"> 

那麼你的查詢將看起來如下:

q=a:(query) AND composite:(query) 
+0

你只能使用copyField一個源到一個目標。你提議的並不多。 – harschware 2011-04-29 13:53:17

+1

上面的copyField的使用是正確的,solr允許將所需字段複製到單個目標字段中。如果你甚至檢查了這個例子,你可以在默認模式文件中看到使用文本作爲複製字段。儘管需要注意的一點是目標字段被定義爲多值字段。 – Umar 2011-05-04 08:43:11

0

的領域çd和e,你應該(用分隔符)的值分裂成另外多值字段。正如@Umar所言。然後,您將有一個字段用於搜索數字(讓該字段被稱爲「數字」)。

所以你的查詢變得

Q =一:(查詢)B:(查詢)編號:(查詢)

假設默認查詢運算符是OR。

如果你只是想簡單的平等搜索,字段「數字」應該是字符串。如果你想允許範圍搜索這些數字,它應該是int。

如果您擔心數字不總是以可預測的格式(即來自用戶輸入),您可以選擇將字段c到e的內容複製到單個文本字段中。這會給你一個更鬆散的匹配能力,但你將無法進行範圍搜索等。 IIRC,SOLR的副本字段將允許您爲一個目標字段指定多個源字段而不會抱怨,但是當您加載文檔時,目標字段將獲得最後執行的copyField的內容。所以這在這裏不起作用,你將需要將內容連接到代碼中的單個字段。

+0

問題是我無法將所有這些值合併到一個字段中。他們就像訪問控制,每個領域都有重要意義,即使其中一個領域不匹配,我也不應該匹配文檔。這是一個與這些不同的領域。 – karthik 2011-04-29 16:48:04

+0

然後只爲所有人使用文本字段,並在字段之間使用AND和OR。簡單。將任何字段查詢與parens分組。例如。 (a:(query)AND b:(query))OR(c:(query)or d:(q1 AND q2))或你想象的任何邏輯表達式。 – harschware 2011-04-29 17:04:17

+0

謝謝你的建議,會試試看。當我們在每個領域有成千上萬的項目時,會有怎樣的表現會有什麼線索? 有沒有辦法編寫一個自定義搜索組件,可以在Solr中以有效的方式執行此操作。通過上述方法,我們增加了大量的查詢條件,這將適用於系統中的每一個搜索,所以我有點擔心這個設計將如何執行。 – karthik 2011-05-02 14:16:58