如何在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