2011-07-13 44 views
0

假設我有一個Lucene索引的Customers。每個客戶都有他們訂購的產品。關聯文檔中的多值字段?

比方說,這兩個傢伙代表我的索引兩個文件:

Name: John Smith 
    Product: Chicken Sandwich, Price: $10 
    Product: Dodge Challenger, Price: $35000 

Name: John Q. Public 
    Product: Chicken Sandwich, Price: $15 
    Product: Audi TT, Price: $35000 

鑑於我的指標是客戶爲中心,而不是以訂單爲中心,我的文檔大概是這樣的:

<add> 
<doc> 
    <field name="Name">John Smith</field> 
    <field name="Product">Chicken Sandwich</field> 
    <field name="Price">10</field> 
    <field name="Product">Dodge Challenger</field> 
    <field name="Price">35000</field> 
</doc> 
<doc> 
    <field name="Name">John Q. Public</field> 
    ... 

這將最終將所有的價格和產品作爲多值字段並失去其相關聯繫。

我該如何將這項功能應用於我的索引 - 以及如何查詢它 - 以便搜索「每個爲雞肉三明治支付超過12美元的顧客」只會返回John Q. Public?

回答

0

聽起來好像您需要的查詢需要將每個單獨的事務處理爲文檔。因此,對於你給的例子中,數據看起來像:

<add> 
<doc> 
    <field name="Name">John Smith</field> 
    <field name="Product">Chicken Sandwich</field> 
    <field name="Price">10</field> 
</doc> 
<doc> 
    <field name="Name">John Smith</field> 
    <field name="Product">Dodge Challenger</field> 
    <field name="Price">35000</field> 
</doc> 
<doc> 
    <field name="Name">John Q. Public</field> 

鑑於上述模式,這裏是爲您的示例可能的查詢語法:

Product:"Chicken Sandwich" AND Price:[00000000 TO 00001200] 

如需進一步資料,Lucene documentation沒有一個更好的工作比我所能做的還要多!

美中不足的是價格字段的數據類型。就編寫最少代碼而言,如果您將其存儲爲零填充字符串(如果我瞭解美國貨幣系統,則可能以美分爲單位!),這是最直接的方法。但是,性能最佳的方法(可能很重要,具體取決於您可能擁有的交易數量)是使用數字字段(同樣用分)。使用Lucene查詢分析器時遇到了麻煩:它不理解這種字段類型。

無論如何,數字領域的問題肯定出現在不同問題的標題下。

祝你好運!

+0

幾乎所有的查詢都是以客戶爲中心的。因此,將我的索引轉換爲以訂單爲中心最終會給我大量重複的客戶數據。是否有標準的方法來清除重複的客戶?沒有什麼我讀過的(過濾器,收集器,整理)似乎適合... – inanutshellus

+0

如果你不是「存儲」數據(即只使用Lucene索引數據),那麼不要擔心它。複製數據不會有太大的區別。這全是關於術語查詢查詢。試試你的數據樣本,看看索引大小有什麼不同。我懷疑你會發現它太令人擔憂(除非你的磁盤空間很小)。 –

+0

我並不擔心這裏的速度/指數大小,更重要的是當我得到重複的客戶時,該怎麼做。例如,在您的示例中搜索所有「John」會返回4條記錄,而不是2條,我寧願不必將重複數據刪除邏輯交給我的java項目。 – inanutshellus

相關問題