Lucene RangeQuery не фильтрует должным образом - PullRequest
6 голосов
/ 02 апреля 2009

Я использую RangeQuery, чтобы получить все документы, которые имеют сумму, скажем, от 0 до 2. Когда я выполняю запрос, Lucene дает мне документы, которые также имеют сумму больше 2. Что мне здесь не хватает?

Вот мой код:

Term lowerTerm = new Term("amount", minAmount);
Term upperTerm = new Term("amount", maxAmount);

RangeQuery amountQuery = new RangeQuery(lowerTerm, upperTerm, true);

finalQuery.Add(amountQuery, BooleanClause.Occur.MUST);

и вот что входит в мой индекс:

doc.Add(new Field("amount", amount.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED, Field.TermVector.YES));

Ответы [ 2 ]

6 голосов
/ 02 апреля 2009

ОБНОВЛЕНИЕ : Как сказал @basZero в своем комментарии, начиная с Lucene 2.9, вы можете добавить числовые поля к своим документам. Просто не забудьте использовать NumericRangeQuery вместо RangeQuery при поиске.

Оригинальный ответ

Lucene рассматривает числа как слова, поэтому их порядок в алфавитном порядке:

0
1
12
123
2
22

Это означает, что для Lucene 12 находится между 0 и 2. Если вы хотите сделать правильный числовой диапазон, вам нужно проиндексировать числа с нулем, а затем выполнить поиск диапазона [0000 TO 0002]. (Необходимое количество отступов зависит от ожидаемого диапазона значений).

Если у вас отрицательные числа, просто добавьте еще один ноль для неотрицательных чисел. (РЕДАКТИРОВАТЬ: НЕПРАВИЛЬНО НЕПРАВИЛЬНО . См. Обновление)

Если ваши числа включают дробную часть, оставьте все как есть и добавьте в ноль только целую часть.

* * Пример тысяча двадцать-один: * * 1 022

-00002.12
-00001

000000
000001
000003.1415
000022

ОБНОВЛЕНИЕ : Отрицательные числа немного сложнее, так как -1 идет перед -2 в алфавитном порядке. Эта статья дает полное объяснение о работе с отрицательными числами и числами в целом в Lucene. По сути, вы должны «кодировать» числа во что-то, что делает порядок элементов понятным.

0 голосов
/ 10 мая 2010

Я создал функцию PHP, которая конвертирует числа в доступные для поиска диапазоны lucene / solr.

0.5 преобразуется в 10000000000.5
-0.5 конвертируется в 09999999999.5

function luceneNumeric($numeric)
{
    $negative = $numeric < 0;
    $numeric = $negative ? 10000000000 + $numeric : $numeric;

    $parts = explode('.', str_replace(',', '.', $numeric));

    $lucene = $negative ? 0 : 1;
    $lucene .= str_pad($parts[0], 10, '0', STR_PAD_LEFT);
    $lucene .= isset($parts[1]) ? '.' . $parts[1] : '';

    return $lucene;
}

Кажется, это работает, надеюсь, это кому-нибудь поможет!

...