如何在Lucene 3.0.1中索引BigDecimal值

我有一些BigDecimal值应该被索引搜索。 Lucene有NumericField,但它只有long,double,float和int的setter。 我可以将它存储为一个字符串,但是我不会从NumericRangeQuery中受益。

您如何存储BigDecimals? 任何最佳实践分享?


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


如果一切都失败了,考虑扩展AbstractField (类似于NumericField扩展它), TokenStream (类似于NumericTokenStream扩展它)和MultitermQuery (类似于NumericRangeQuery扩展它)。 所有三个Numeric *类不幸都是最终的,所以它们不能自行扩展:(好消息是这些类中的逻辑相当简单,对于BigDecimals应该很容易对其进行改进。

即使NumericField将它存储在一个字符串中,数据的存储也是微不足道的。 从javadoc:

注意:此类仅在索引过程中使用。 在搜索后从Document实例中检索存储的字段值时,您将获得一个常规的Fieldable实例,其中的数值作为字符串返回(根据使用的数据类型的toString(值))。

如果你走这条路线,试着将补丁发送给Lucene开发者,或者至少填写JIRA请求。 Lucene的开发人员通常都很友好和开放,所以这也可以让其他人受益。

链接地址: http://www.djcxy.com/p/45553.html

上一篇: How to index BigDecimal values in Lucene 3.0.1

下一篇: design version control (dealing with images)