Range Query с Lucene 2.9.x - даты в индексе не работают - PullRequest
3 голосов
/ 29 апреля 2011

Я использую следующую инструкцию для индексации даты:

luceneDoc.add(new NumericField(key).setLongValue(date.getTime()));

Я также использую следующие инструкции для добавления свойств текста:

luceneDoc.add(new Field(key, value, Field.Store.YES, Field.Index.ANALYZED));

Затем я выполняю запрос свойства текста:

author:hans

Это прекрасно работает.Но когда я выполняю запрос диапазона, ничего не возвращается:

my-date-property:[20100101 TO 20110101]

Что мне здесь не хватает?

Я посмотрел на индекс с Люком, я вижу все свои свойства текста длядокумент , но свойства даты появляются только на странице обзора ... может быть, это нормально .Я на самом деле вижу свойства даты, если добавляю это так:

NumericField field = new NumericField(key, Field.Store.YES, true);
field.setLongValue(date.getTime());
luceneDoc.add(field);

Но: запрос все еще не работает!Может быть, он работает только с Java с помощью Query Builder?Я не пробовал это.Но было бы здорово, если бы текстовый запрос тоже работал.ЛЮБАЯ ИДЕЯ ???

Ответы [ 3 ]

3 голосов
/ 01 мая 2011

Если вы хотите, чтобы запрос диапазона работал с датами в форме YYYYMMDD, то индексируйте свою дату следующим образом:

String dateString = DateTools.dateToString(date, Resolution.DAY);
luceneDoc.add(new Field(key, dateString, Store.YES, Index.NOT_ANALYZED));
1 голос
/ 01 мая 2011

Числовые поля и запросы числовых диапазонов просто великолепны, но их действительно сложно использовать впервые!

В настоящее время стандартный анализатор запросов не поддерживает запросы с числовым диапазоном. Чтобы использовать числовые поля, вам нужно получить собственные варианты синтаксического анализатора запросов и, при необходимости, построить запросы числового диапазона.

Немного поясняя мой первоначальный ответ (я только что видел его в комментарии ...), я должен отметить, что запросы диапазона, где числа преобразуются в (обычно) текст с нулевым префиксом, работают нормально (хотя и относительно медленно). ) в стандартном парсере запросов. Исходя из размещенной исходной информации, вопрос заключается в том, как использовать числовые поля (tree-закодированные) в запросе. Для этого вам необходимо проанализировать запрос таким образом, чтобы он генерировал запросы с числовым диапазоном (которые понимают триан-кодировки). Они работают намного быстрее, чем текстовые числовые поля.

Удачи

1 голос
/ 29 апреля 2011

Попробуйте объявить my-date-property как DateField.

Поскольку вы используете NumbericField, я предполагаю, что указанный диапазон интерпретируется как числовой диапазон вместо диапазона дат. В этом случае числа 20100101 и 20110101 слишком малы, чтобы получить какие-либо разумные результаты.

...