2009-11-18 92 views
8

我正在使用Lucene來索引和搜索少量的大文檔。使用Lucene站點的演示文件,我已對文檔建立了索引並能夠搜索它們。但是,搜索結果並不特別有用,因爲它指向文檔的文件。對於非常大的文檔,這不是特別有用。Lucene可以從單個索引文件返回多個搜索結果嗎?

我想知道如果Lucene可以索引這些非常大的文檔,並創建一個抽象它們提供更細粒度的結果。

一個例子可能會更好地解釋我的意思。考慮一本非常大的書,比如聖經。一個文件包含聖經的全部文本,因此在演示中,搜索結果「大馬士革」將指向該文件。我想要做的是保留大文檔,但是搜索會返回結果指向書本,章節或甚至與詩歌一樣精確。因此,搜索「大馬士革」可能會返回(除其他外)第23卷第7章第8節。

這是可能的(以及Lucene使用中的最佳實踐),還是應該嘗試將大文檔分割爲許多小文件要索引?

如果它有什麼區別,我使用的是Java Lucene 2.9.0,並且索引HTML文件的大小約爲1MB到4MB。在文件大小方面,這個數字並不大,但相對於閱讀它的人來說卻很大。


我不認爲我已經盡我所能解釋了這一點。這裏舉另一個例子。

說我拿我的大HTML文件,並且(出於參數的緣故)搜索詞「大馬士革」出現3次。一旦在<div>標籤內在線100上,在線2000上在<p>標籤內,在線上5000內在<h1>標籤內。有沒有可能使用Lucene進行索引,這樣會有3個結果,並且它們可以指向該術語所在的特定元素?

我不認爲我想爲該術語提供不同的文檔結果。所以如果術語'大馬士革'在特定的<div>出現兩次,那隻會有一場比賽。

Kragen的評論看來,我想要做的就是在Lucene正在經歷索引階段時解析HTML。然後,我可以決定我想作爲解析器讀入內容的一個文檔塊。所以,如果我看到一個具有某個類的div,我可以開始一個新的Lucene文檔,並且當div內容中的單詞被搜索時,它將作爲單獨的命中返回。

這聽起來像我想要做的,這有可能嗎?

回答

1

是 - Lucene記錄文件中匹配項的偏移量,以便可以用來確定索引內容中需要查找匹配項的位置。

有一個Lucene.Highlight插件爲你完成這個確切的任務 - 嘗試this article,在StackOverflow上還有一些關於命中突出顯示的問題(其中很多都是針對Web應用程序定製的,不喜歡與<b>標籤)

UPDATE周邊配套話事:根據您搜索索引,你可能會發現,它的一個好主意,你的大文件分割成更小的部分(例如章),以及 - 然而,這更多的是關於如何組織,確定優先順序並將結果呈現給最終用戶的問題。

例如,假設用戶搜索「foo」並且有兩本書包含該術語。第一本書(書A)可能包含兩章,其中每一章都有很多對「foo」的引用,但是這本書在本書的其餘部分中幾乎沒有提及,但是第二本書(書B)包含許多對「foo」的引用, ,但是它們散佈在整本書的周圍。如果您按書籍編制索引,那麼您可能會發現B書是第一次打開,但按章節編制索引時,您可能會發現書A的兩章是前兩章,其次是B書的章節。

最後,顯然,用戶每次在索引中找到的匹配文檔都會出現1次匹配 - 如果您想向用戶展示匹配的書籍列表,然後顯然通過書籍索引,但是您可能會發現它更適合向用戶呈現匹配章節的列表,在這種情況下明顯按章節索引。

+0

使用您的示例,我可以將書籍B保存爲單個文件(在我的情況下爲HTML文件),並從該文件中創建多個Lucene文檔,以便可以將單個文件的所有結果作爲離散形式報告給用戶點擊?當章節位於同一個*文件*中時,是否可以按章節進行索引?感謝您的回答:) – Grundlefleck

+0

您可以通過在索引時爲Lucene提供該文件的一個子集來按章節索引 - 這會爲每個匹配章節提供1次命中。如果您想向用戶展示每次單獨匹配的匹配,那麼您需要查看每個匹配文檔的所有匹配項 - 無法將書分成足夠多的Lucene文檔,以確保每次匹配都能保證對應於該詞/詞組的恰好1次出現。 – Justin

0

這樣做的一種方法是從一本書中創建幾個文檔。這些文件可以代表書籍,章節或詩句。由於文本不一定是唯一的,所以我會這樣做。 這樣,創世記第一章中的第一節將被索引四次:在整本聖經,創世記,第一章和詩節中。

這裏的一個細微之處在於檢索的確切目標: 您是否只想在上下文中向用戶顯示搜索關鍵字?在這種情況下,考慮使用Lucene highlighter。如果您需要進一步使用檢索(即,將檢索到的指針帶到章節或詩句中,並在文本中對這個位置進行一些處理),我會像前面描述的那樣使用更細粒度的文檔。

+0

目標是提供在Swing應用程序中顯示HTML,搜索結果將允許用戶導航到HTML的那一部分。搜索也可以提供預覽。要說清楚,當你說'用一本書創建多個文檔'時,你的意思是說Lucene文檔還是新文件? – Grundlefleck

+0

我的意思是Lucene文檔。 –