2010-10-13 197 views
0

我想使用單個字段來索引文檔的標題和正文,以提高性能。「提升」lucene文檔中相同字段的不同實例

當時的想法是做這樣的事情:

Field title = new Field("text", "alpha bravo charlie", Field.Store.NO, Field.Index.ANALYZED); 
title.setBoost(3) 
Field body = new Field("text", "delta echo foxtrot", Field.Store.NO, Field.Index.ANALYZED); 
Document doc = new Document(); 
doc.add(title); 
doc.add(body); 

然後我可以做一個單一的TermQuery代替BooleanQuery兩個不同的領域。

但是,事實證明,字段提升是文檔中同名字段的所有提升的multiple。在我的情況下,這意味着這兩個領域的推動力爲3.

有沒有一種方法可以得到我想要的而不訴諸於使用兩個不同的領域?一種方法是將title字段多次添加到文檔中,這會增加術語頻率。這很有效,但似乎令人難以置信的腦死亡。

我也知道關於payloads,但這似乎對我以後的事情有點矯枉過正。

任何想法?

+0

你可以進入的一些細節你試圖克服的性能問題?我從來沒有遇到在兩個單獨字段上使用BooleanQuery的問題。 – Snekse 2010-10-13 15:15:31

+0

我還沒有測試過它,但我很確定搜索'(title:bravo OR body:bravo)'比'text:bravo'需要更長的時間 – itsadok 2010-10-14 08:03:29

回答

0

如果您想從Google書籍(至少是他們的舊書)中取出一個頁面,那麼您可能需要創建單獨的索引:一個用於文檔主體,另一個用於標題。我假設有一個存儲的字段指向每個實際文檔的真實UID。

另一個答案是編寫[Similarity] [1]的自定義實現來獲得你想要的行爲。不幸的是,我發現Lucene經常需要這種定製的獨特問題出現。

[1]:http://lucene.apache.org/java/3_0_2/api/all/org/apache/lucene/search/Similarity.html#lengthNorm(java.lang.String,INT)

+0

想想你可能想要保留這些的另一個原因數據元素在單獨的字段或單獨的索引中:如果它們在同一索引中共享相同的字段名稱,Body中的大量內容可能會破壞Title的詞頻。如菜單,表格或家庭(如果您使用的是基本網頁)這樣的字詞會更頻繁地出現在標題中,從而減少這些字詞的重量。 – Snekse 2010-10-13 15:20:02

0

您可以與通過所期望的值升壓標題字段索引標題和主體分開。然後,您可以使用MultiFieldQueryParser來搜索多個字段。

雖然從技術上講,搜索多個領域需要較長的時間,通常即使有這方面的開銷,Lucene的往往是非常快(的幾十或幾百毫秒的量級)。

相關問題