2013-04-15 31 views
1

我期望能夠訪問文檔索引後特定字段的長度(以字節爲單位)。最好是,如果沒有重新索引的方式,我想這樣做。但是,如果以某種方式重新編制索引可以輕鬆訪問此值,那也可以起作用。在Lucene 4中查找文檔/字段長度

http://blog.mikemccandless.com/2012/03/new-index-statistics-in-lucene-40.html

該鏈接(scoll下來了一下,發現長度的提及)的索引時間訪問值的會談。我希望能夠做到後索引。該鏈接還談到了將價值儲存到文檔價值,但沒有提供如何這樣做的例子。

如果任何人都可以提供保存文檔長度的示例,或者在索引後訪問它,這將會非常有幫助。謝謝。

回答

1

該文中提到的統計量是參照FieldInvertState。一旦你有了這些,應該相當直接地知道如何獲得你正在尋找的統計數據(只需撥打getLength,getUniquetermCount或任何你需要的)。

FieldInvertState被傳遞到Similarity,特別是呼叫Similarity.computeNorm。規範值是在索引時間計算和存儲的,而不是在查詢時進行評估,因此有效使用它會要求您重新索引。

使用此的典型方法是創建自定義Similarity,可能會延伸DefaultSimilarity。簡單地覆蓋lengthNorm方法DefaultSimilarity將是最簡單的方法。它的標準實施是:

return (float)(1.0/Math.sqrt(numTerms)); 

你可以用你喜歡的任何東西來覆蓋。

這將基於自定義的基於長度的計算來調整評分。如果這不是你正在尋找的東西,而是需要能夠獲取這些信息,我會認爲只是存儲和字段,並且從獲取Document時返回的字段值中獲取長度將是最簡單的實現。

+0

我知道通過擴展DefaultSimilarity來覆蓋lengthNorm,使其返回長度的能力,但是lengthNorm方法需要一個FieldInvertState作爲參數。 Lucene 4 API中沒有方法返回FieldInvertState對象。我想如何使用lengthNorm? 謝謝。 – user2282763

+0

將您的自定義相似性類設置爲索引和搜索時要使用的相似性(分別爲IndexwriterConfig.setSimilarity和IndexSearcher.setSimilarity),並且Lucene將調用它,並在索引文檔時將FieldInvertState傳遞給computeNorm方法。 – femtoRgon

+0

我沒有打算使用IndexSearcher,我使用一些基本代碼對Lucene API以外的文檔進行排名。對於長度值來說似乎有點過分,但我會嘗試並回復給你。謝謝。 – user2282763