我有一些BigDecimal值,应该为搜索编制索引。 Lucene有NumericField,但它只有long,double,float和int的setter。我可以将它存储为String但我不会受益于NumericRangeQuery。
你如何存储你的BigDecimals?要分享哪些最佳做法?
答案 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