2010-02-11 45 views
3

我基本上要Solr的搜索多值字段的每個記錄我的搜索參數..我的例子閱讀:Solr中,如何對查詢進行不同的值集的一個字段的多值字段

我正在使用Solr來索引我的數據。我有與給定產品匹配的並行數組(以多值字段的形式)的應用程序數據。請看下面的例子,在品牌,型號和年份都多值字段:我使用的過濾器查詢(& FQ =),以縮小我的選擇

<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
<-solr record end->

。問題是,如果有人查找2000 Acura Integra,它將與上述記錄相匹配,但由於製造商,型號和年份數據是並行編碼的,因此實際上該產品沒有2000 Acura Integra。 Solr與make字段中的make,模型字段中的模型以及year字段中的年份(應該如此)匹配並返回此結果,而不尊重我的並行性。 我的查詢應該是這樣的,到目前爲止:


fq=make:"acura"&fq=model:"integra"&fq=year:2000 (I would normally escape URL characters when I POST to Solr, this is just an example)

所以我的解決方案是創建另一個多值字段,被稱爲總結領域,我會把所有的品牌,型號,年份和其他數據(如引擎)一起分隔空間。有必要在單詞旁邊添加引號,這樣多個單詞的術語不會無意中與搜索參數匹配。上面的例子,現在應該是這樣的:

<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
summary: "acura" "integra" "1997" "3.4", "acura" "rsx" "2004" "4.5", "acura" "rsx" "2000", "4.5"
<-solr record end->

我然後添加到我的查詢如下:

summary:(""acura" AND "integra" AND "2000")

我所期望的,如果我補充說,我的查詢,這記錄將不再出現,因爲在摘要字段中沒有acura integra 2000。但是,這並不奏效。記錄仍然出現。我很難過。有沒有人有解決這個問題的方法。這幾天一直在殺我。

我基本上想要Solr搜索我的搜索參數的多值字段的每個記錄..這可能嗎?有沒有更好的方法來做我想做的事情?

謝謝

回答

3

我仍然不確定如何在沒有彙總字段的情況下保持並行性,但我想出瞭如何使用匯總字段進行操作。而不是使用AND語句,我相信在多值字段中搜索每條記錄進行匹配(每個AND'ed詞可以匹配多值字段中的不同行,不一定是同一行),而是將精確的術語「重新尋找,按照您創建原始摘要記錄的相同順序,並使用〜運算符。

看看下面的例子:

以下是摘要字段的內容在多值字段中的行,我想匹配的一個: "Honda" "Accord" "2004" "3.5L"

這裏是查詢我將運行: summary_field:("\"Honda\" \"2004\"")

上述查詢本身不起作用。儘管我可以擁有一個函數,可以將來自應用程序的用戶輸入與原始摘要字段的建立順序相同,因爲應用程序中的用戶可以按任意順序輸入一段數據(品牌,型號年份),但在那裏可能是我想要匹配的數據之間的其他詞。在上面的例子中,我想匹配本田2004年的記錄。但是,雅閣就在它之間。

要解決此問題,只需使用〜n操作符,其中n是您正在搜索的術語之間的其他術語的最大數目。所以,如果我改用:

summary_field:("\"Honda\" \"2004\""~1)

我說,本田和2004年之間,有沒有被其他1個字的可能性。因此,這個上面的查詢將匹配。即使向摘要字段添加多個字詞,只要您使用相同順序的值對其進行查詢,並且您的模糊搜索邏輯使用的數字將是2個值之間的最大距離,您的查詢將始終正確匹配正確的總結字段。因此,如果您將20個字段添加到摘要字段以保持並行性,那麼只需使用〜18,因爲這是用戶可以選擇的最差情況下單詞之間的最大可能距離。

3

看來你的模式不太正確。您需要將數據完全非規範化併爲每輛車創建一個文檔。什麼是「車輛」意味着什麼取決於你將運行什麼樣的搜索。例如,一個可能的模式是:

sku: 1234 
make: acura 
model: integra 
years: 1997 
engines: 3.4, 4.5 

sku: 1235 
make: acura 
model: rsx 
years: 2000, 2004 
engines: 4.5 

彙總場將是製造商+型號+年+發動機

+0

嘿。這完全是我原來的解決方案,它完美的工作!唯一的問題是,當您轉到我的網站的產品屏幕時,您正在查看應用程序的數量而不是產品的數量。如果同一品牌,型號和年份屬於sku,並且只有引擎或子模型不同,我只是在產品下方的「適合」部分聲明。例如,我可能將4個應用程序一起拖放到我的網站上的1個產品「盒子」中。搜索結果應該說是查看1中的1,而是說查看4中的4(即使屏幕上有一個框)。因此,我的新架構... – Dan

+0

@丹:看看領域崩潰:http://wiki.apache.org/solr/FieldCollapsing –

+0

因爲問題是一個SKU(12345)可以適應多個車輛。每個SKU +車輛作爲自己的記錄都不錯,但將它們視爲客戶是非常可怕的。通過捲起每輛車(和應用程序)並將其附加到適合的相同SKU上,可以使其更易於觀看。不管怎樣,你可能每頁看10個應用程序,但你只有3個「盒子」,用戶可以在其中購買東西。所以它表示查看項目1到10,但只有3「盒子」與圖片和「點擊購買按鈕」列出。 – Dan

0

的copyField你能不能只是做一個查詢,如下所示?

make:acura AND model:integra AND year:2000 

I.e.沒有圍繞品牌和型號的行情。