我有一些 BigDecimal 值,应该为搜索建立索引。Lucene 有 NumericField,但它只有 long、double、float 和 int 的设置器。我可以将它存储为字符串,但我不会从 NumericRangeQuery 中受益。
您如何存储 BigDecimals?有什么最佳实践可以分享吗?
我有一些 BigDecimal 值,应该为搜索建立索引。Lucene 有 NumericField,但它只有 long、double、float 和 int 的设置器。我可以将它存储为字符串,但我不会从 NumericRangeQuery 中受益。
您如何存储 BigDecimals?有什么最佳实践可以分享吗?
如果一切都失败了,考虑扩展AbstractField
(类似于如何NumericField
扩展它),TokenStream
(类似于如何NumericTokenStream
扩展它)和MultitermQuery
(类似于如何NumericRangeQuery
扩展它)。不幸的是,所有三个 Numeric* 类都是最终类,因此它们不能自行扩展 :( 好消息是这些类中的逻辑相当简单,应该很容易为 BigDecimals 改进它。
数据的存储是微不足道的,甚至NumericField
将其存储在字符串中。从javadoc:
注意:此类仅在索引期间使用。在搜索后从 Document 实例中检索存储的字段值时,您将获得一个常规的 Fieldable 实例,其中数值作为字符串返回(根据使用的数据类型的 toString(value) )。
如果您要走这条路,请尝试向 Lucene 开发人员发送补丁或至少填写 JIRA 请求。Lucene 开发人员通常都是友善而开放的人,因此这也可以使其他人受益。
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