В настоящее время мы используем Lucene 2.1.0 для поиска по сайту, и мы столкнулись с трудной проблемой: одно из наших полей индекса игнорируется во время целевого поиска. Вот код для добавления поля в документ в нашем индексе:
// Add market_local to index
contactDocument.add(
new Field(
"market_local"
, StringUtils.objectToString(
currClip.get(
"market_local"
)
)
, Field.Store.YES
, Field.Index.UN_TOKENIZED
)
);
Выполнение запроса (*) по индексу вернет следующие результаты:
Result 1:
title: Foo Bar
market_local: Local
Result 2:
title: Bar Foo
market_local: National
Выполнение целевого запроса:
+( market_local:Local )
не найдет никаких результатов.
Я понимаю, что это очень специфический вопрос, я просто пытаюсь получить информацию о том, с чего начать отладку этой проблемы, так как я новичок в Lucene.
ОБНОВИТЬ
Установил Люк, проверял последний индекс ... Поле market_local доступно для поиска, поэтому, если я выполню что-то вроде:
market_local:Local
Поиск работает корректно (в Луке). Я сейчас просматриваю наш код анализатора, могу ли я как-нибудь списать эту проблему на то, что наше поисковое приложение использует Lucene 2.1.0, а последняя версия Luke использует 2.3.0?




Для отладки Lucene лучше всего использовать Люк, который позволяет вам копаться в самом индексе, чтобы увидеть, что было проиндексировано, выполнить поиск и т. д. Я рекомендую загрузить его, указав на свой индекс и посмотреть, что там находится.
В раздел "Почему я не получаю обращений?" в FAQ по Lucene есть несколько предложений, которые могут оказаться полезными. Вы используете Field.Index.UN_TOKENIZED, поэтому анализатор не будет использоваться для индексации (я думаю). Если вы используете анализатор при поиске, то это может быть корнем вашей проблемы - анализаторы индексации и поиска должны быть одинаковыми, чтобы гарантировать получение правильных результатов.
Еще одна простая вещь - использовать отладчик или оператор ведения журнала для проверки значения
StringUtils.objectToString(currClip.get("market_local"))
чтобы убедиться, что это именно то, что вы думаете.
Люк поставляется вместе с Lucene, но вы можете сказать Люку использовать другую версию Lucene. Скажем, «lucene-core-2.1.0.jar» содержит Lucene 2.1.0, который вы хотите использовать, а «luke.jar» содержит Lucene с Lucene 2.3.0. Затем вы можете запустить Люка с помощью следующей команды.
java -classpath lucene-core-2.1.0.jar;luke.jar org.getopt.luke.Luke
(Хитрость заключается в том, чтобы поместить вашу версию Lucene перед Luke в путь к классам. Кроме того, это в Windows. В Unix замените ";" на ":".)
Как вы можете проверить у Люка,
+( market_local:Local )
переписывается на
market_local:Local
если вызывается метод rewrite (IndexReader) объекта Query. Два запроса должны быть эквивалентными, поэтому в 2.1 может быть ошибка. Если вам нужно использовать 2.1, вы можете попробовать вызвать этот метод вручную перед передачей объекта Query в IndexSearcher.