2012-03-12 71 views
14

索引中Lucene的一個布爾值(真/假),(不需要存儲) 我想獲得更多的磁盤空間使用情況和更高的搜索性能在lucene中索引布爾值的最佳選擇是什麼?

doc.add(new Field("boolean","true",Field.Store.NO,Field.Index.NOT_ANALYZED_NO_NORMS)); 
//or 
doc.add(new Field("boolean","1",Field.Store.NO,Field.Index.NOT_ANALYZED_NO_NORMS)); 
//or 
doc.add(new NumericField("boolean",Integer.MAX_VALUE,Field.Store.NO,true).setIntValue(1)); 

哪些我應該選擇?或者其他更好的方法?

非常感謝

回答

10

一個有趣的問題!

  • 我不認爲第三個選項(NumericField)是一個布爾型字段的好選擇。我想不出任何用例。
  • Lucene搜索索引(留下一側所存儲的數據,其中不使用反正)被存儲爲一個倒排索引
  • 離開第一和第二選項(理論上)相同

如果我面對這個問題,如果它影響到最終決定,我想我會選擇一個選項(「真」和「假」)。我覺得你的NOT_ANALYZED_NO_NORMS看起來不錯。

+0

嗨,@ adrian-conlon,你能幫忙嗎?非常感謝http://stackoverflow.com/questions/10464377/using-booleanquery-or-write-more-indexes – Koerr 2012-05-07 11:00:33

2

Lucene會跳過一組精心設計的箍環,使NumericField可以通過NumericRangeQuery進行搜索,所以一定要避免在所有情況下您的值不代表數量。例如,即使索引一個整數,但只作爲一個唯一的ID,您仍然希望使用純String字段。使用「true」/「false」是索引布爾值的最自然的方法,而使用「1」/「0」通過避免發生大小寫不匹配或拼寫錯誤的可能性而略微獲益。我會說這個優勢不值多少,並且是真的/假的。

+0

此外NumericRangeQuery,牢記NumericField的另一個好處:NumericField是理想的排序,因爲建築領域的緩存比純文本數字快得多。 來源:http://lucene.apache.org/core/2_9_4/api/core/org/apache/lucene/search/NumericRangeQuery.html – 2013-10-20 08:44:58

4

使用Solr(lucene的味道) - 它本地索引所有基本的Java類型。

我已經使用它,它會晃動。

相關問題