2012-02-17 69 views
3

我有一個事物數據庫,每個事物都可以有不同語言的多個名稱。這是目前歸一東西有,很多名字模式:非規範化混合語言文檔的Solr語言檢測更新處理器

things 
------ 
id 
... 

names 
----- 
id 
thing_id 
language 
name 

我這個索引使用Solr的,我試圖找出非規範化成爲Lucene的模式是最好的方法。這一個工作好:

<fields> 
    <field name="id" type="uuid" indexed="true" stored="true" required="true" /> 
    ... 
    <field name="name_eng" type="text_eng" indexed="true" stored="true" /> 
    <field name="name_jpn" type="text_cjk" indexed="true" stored="true" /> 
    <field name="name_kor" type="text_cjk" indexed="true" stored="true" /> 
</fields> 

的問題是,我需要指定一個字段,字段類型爲支持的每種語言逐個,並有可能成爲很多。由於我也使用SQL DataImportHandler,這意味着我必須複製大量代碼才能指定SQL查詢以將這些數據從數據庫導入到此模式中。此外,名稱的language字段並不總是正確的,因爲它基於用戶輸入。

我一直在尋找language detection capabilities Solr優惠,看起來非常好。但他們似乎只對整個文檔起作用,在這種情況下,我猜不會有太大的幫助。有沒有一種方法可以在我可以存儲名稱的模式中指定一個單獨的multiValued字段,其​​名稱將被相應地自動檢測並編入索引?或者其他語言檢測設施可以讓我的生活更輕鬆嗎?

回答

0

你也許可以編寫一個在索引端會這樣做的變換器,但是查詢端不會得到相同的分析鏈,所以這是行不通的。

這些「東西」的文字是什麼樣的?

如果少於200個字符,語言ID將無法正常工作。用統計學的方法把它看作「語言猜測」。對於少量數據,猜測是不好的。是「移動」英語還是丹麥語?兩者,真的。 「Die」是英語和德語,等等。對於一個很好的猜測,一千個字符會有幫助。

文本是否有商標名? 「LaserJet」和「Linux」在所有語言中都是相同的,而且很少受到影響,因此語言處理不會做任何事情。也許你可以沒有語言特定的詞幹。

最後,你可能會考慮n-gram而不是語言處理。這是一個與語言敏感匹配完全不同的模型,但它可能對此更好。從某種意義上說,它正在進行與語言ID相同類型的統計模式匹配,但是在查詢時而不是索引時。它將從查詢中獲取短序列模式並查找文本中的模式序列。它需要更多時間和空間,但值得一試。