У меня есть некоторые значения BigDecimal, которые должны быть индексированы для поиска. Lucene имеет NumericField, но он имеет методы set только долгое время, дважды, плавание и интервал. Я мог сохранить его как Строку, но затем я не извлеку выгоду из NumericRangeQuery.
Как Вы сохранили свой BigDecimals? Какие-либо лучшие практики для совместного использования?
Стивен Роу предлагает интересные идеи в этом сообщении:
http://www.lucidimagination.com/search/document/ad648772f8825a28/bigdecimal_values#2502f96055839c3d
Он говорит, что его схему, вероятно, можно было бы использовать для представления всех значений BigDecimal. Кажется, проще реализовать, если вам не нужны отрицательные значения. Как и предполагалось, вы можете расширить AbstractField для реализации этого.
Есть также Йоник Сили, который говорит, что начал некоторую работу в Solr для этого с классом BCDUtils:
http://www.lucidimagination.com/search/document/ad648772f8825a28/bigdecimal_values#cef1d0e25af063ef
Если все остальное не получается, подумайте о расширении AbstractField
(подобно тому, как NumericField
расширяет его), TokenStream
(аналогично тому, как NumericTokenStream
расширяет его) и MultitermQuery
(аналогично тому, как NumericRangeQuery
расширяет его). Все три класса Numeric*, к сожалению, являются конечными, поэтому их нельзя расширить самостоятельно :( Хорошей новостью является то, что логика в этих классах довольно тривиальна, и ее легко можно приспособить для BigDecimals.
Хранение данных тривиально, поскольку даже NumericField
хранит их в String. Из javadoc:
ПРИМЕЧАНИЕ: Этот класс используется только во время индексирования. При извлечении сохраненного значения поля из экземпляра документа после поиска, вы получите обычный экземпляр Fieldable, в котором числовые значения возвращаются как строки (в соответствии с toString(value) используемого типа данных).
Если вы пойдете этим путем, попробуйте отправить патч разработчикам Lucene или хотя бы заполнить запрос в JIRA. Разработчики Lucene в целом хорошие и открытые люди, так что это может принести пользу и другим.