Каков наилучший выбор для индексации булевского значения в lucene?

Индексирование логического значения (true/false) в lucene (не нужно хранить) Я хочу получить больше дискового пространства и более высокую производительность поиска

doc.add(new Field("boolean","true",Field.Store.NO,Field.Index.NOT_ANALYZED_NO_NORMS));
//or
doc.add(new Field("boolean","1",Field.Store.NO,Field.Index.NOT_ANALYZED_NO_NORMS));
//or
doc.add(new NumericField("boolean",Integer.MAX_VALUE,Field.Store.NO,true).setIntValue(1));

Что выбрать? Или любой другой лучший способ?

Большое спасибо

Ответ 1

Интересный вопрос!

  • Я не думаю, что третий вариант (NumericField) - хороший выбор для булевского поля. Я не могу придумать какой-либо прецедент для этого.
  • Индекс поиска Lucene (оставляя в одну сторону сохраненные данные, которые вы не используете в любом случае) сохраняется как инвертированный индекс
  • Оставляя первый и второй варианты как (теоретически) идентичные

Если бы я столкнулся с этим, я бы выбрал вариант один ( "истинный" и "ложный" термины), если он повлияет на окончательное решение.

Ваш выбор NOT_ANALYZED_NO_NORMS выглядит неплохо, я думаю.

Ответ 2

Используйте Solr (аромат lucene) - он индексирует все основные типы Java изначально.

Я использовал его, и он качается.

Ответ 3

Lucene перескакивает через сложный набор обручей, чтобы сделать NumericField доступным для поиска с помощью NumericRangeQuery, поэтому обязательно избегайте его всех случаев, когда ваши значения не представляют количества. Например, даже если вы индексируете целое число, но только как уникальный идентификатор, вы все равно хотите использовать простое строковое поле. Использование "true" / "false" является наиболее естественным способом индексирования логического значения, а использование "1" / "0" дает лишь небольшое преимущество, избегая возможности несоответствия или опечатки. Я бы сказал, что это преимущество не стоит много и идет на истину/ложь.