8

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

您如何存储 BigDecimals?有什么最佳实践可以分享吗?

4

2 回答 2

3

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

数据的存储是微不足道的,甚至NumericField将其存储在字符串中。从javadoc:

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

如果您要走这条路,请尝试向 Lucene 开发人员发送补丁或至少填写 JIRA 请求。Lucene 开发人员通常都是友善而开放的人,因此这也可以使其他人受益。

于 2010-04-28T14:31:22.933 回答
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

于 2010-04-28T17:37:22.590 回答