如何索引Lucene 3.0.1中的BigDecimal值

时间:2010-04-28 14:08:25

标签: java indexing lucene search-engine bigdecimal

我有一些BigDecimal值,应该为搜索编制索引。 Lucene有NumericField,但它只有long,double,float和int的setter。我可以将它存储为String但我不会受益于NumericRangeQuery。

你如何存储你的BigDecimals?要分享哪些最佳做法?

2 个答案:

答案 0 :(得分:3)

如果其他一切都失败了,考虑延长AbstractField(类似于NumericField扩展它的方式),TokenStream(类似于NumericTokenStream如何扩展它)和{{1} }(类似于MultitermQuery扩展它的方式)。不幸的是,所有三个Numeric *类都是最终的,所以它们无法自行扩展:(好消息是这些类中的逻辑相当简单,并且很容易为BigDecimals改进它。

即使NumericRangeQuery将数据存储在String中,数据的存储也是微不足道的。来自javadoc:

  

注意:此类仅在索引期间使用。从中检索存储的字段值时   搜索完一个Document实例后,你会得到一个传统的Fieldable实例   数值作为字符串返回(根据使用的数据类型的toString(value))。

如果您选择这条路线,请尝试向Lucene开发人员发送补丁或至少填写JIRA请求。 Lucene开发人员通常都是善良和开放的人,所以这也可以使其他人受益。

答案 1 :(得分:1)

Steven Rowe在这篇文章中提供了有趣的想法:
http://www.lucidimagination.com/search/document/ad648772f8825a28/bigdecimal_values#2502f96055839c3d

他说他的方案可能用于表示所有BigDecimal值。如果您不需要负值,似乎更容易实现。像mindas建议的那样,你可以扩展AbstractField来实现它。

还有Yonik Seeley说他已经在Solr开始了一些与BCDUtils类相关的工作:
http://www.lucidimagination.com/search/document/ad648772f8825a28/bigdecimal_values#cef1d0e25af063ef