Поиск по числовому диапазону Lucene с помощью LUKE - PullRequest
3 голосов
/ 03 февраля 2011

У меня есть несколько числовых индексированных полей Lucene:

60000
78500
105000

Если я использую LUKE для запроса 78500 следующим образом:

price:78500

Возвращает правильную запись, однако, если я пытаюсь вернуть все три записи как диапазон, я не получаю результатов.

price:[60000 TO 105000]

Я понимаю, что это происходит из-за заполнения, так как числа обрабатываются Lucene как строки, однако я просто хочу знать, что я должен поместить в LUKE, чтобы вернуть три записи.

Большое спасибо за любую помощь.

Ответы [ 4 ]

11 голосов
/ 06 мая 2013

Если поля проиндексированы как NumericField, вы должны использовать опцию «Использовать XML Query Parser» на вкладке анализатора запросов и версию 3.5 Luke:

https://code.google.com/p/luke/downloads/detail?name=lukeall-3.5.0.jar&can=2&q=

Пример запроса со строкой и числовым полем :

<BooleanQuery>
<Clause fieldName="colour" occurs="must">
    <TermQuery>rojo</TermQuery>
</Clause>
<Clause fieldName="price" occurs="must">
    <NumericRangeQuery type="int" lowerTerm="4000" upperTerm="5000" />
</Clause>
</BooleanQuery>
3 голосов
/ 07 февраля 2011

Решение, которое я использовал для этого, состояло в том, что значения, введенные для цены, необходимо добавить к индексу в дополненной форме. Тогда я бы просто запросил новое значение дополнения, которое прекрасно работает. Поэтому новые значения в индексе были:

060000
078500
105000

Это решение было связано с проблемой поиска Examine для Umbraco, поэтому на форуме есть ветка о том, как реализовать поиск по диапазону на основе чисел, если кому-то это нужно, оно находится здесь с сквозным переходом.

Тема форума Umbraco

1 голос
/ 05 февраля 2011

Я предполагаю, что эти поля проиндексированы как NumericField с. Проблема с ними в том, что Lucene / Luke не знает, как автоматически разбирать числовые запросы. Вам нужно переопределить Lucene QueryParser и предоставить свою собственную логику того, как эти числа следует интерпретировать.

Насколько я знаю, Люк позволяет вставлять свой пользовательский парсер, он просто должен присутствовать в CLASSPATH.

Посмотрите на эту ветку в списке рассылки Lucene:

http://mail-archives.apache.org/mod_mbox/lucene-java-user/201102.mbox/%3CAANLkTi=XUpyw09tcbjuTzNRpMJa730Cq-6_1agMAjYz6@mail.gmail.com%3E

1 голос
/ 04 февраля 2011
  1. Заполнение нулями не входит в этот конкретный запрос, поскольку все показанные вами числа имеют одинаковое количество цифр
  2. Показанный диапазон запроса содержит слишком много нулей на второмчасть диапазона
  3. Таким образом, запрос для данных, которые вы показали, будет price:[10500 TO 78500]

Надеюсь, это поможет,

...