Устранение неполадок с игнорированием поля Java Lucene
Вопрос
В настоящее время мы используем 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.
Обновить
Установил Luke, проверяя последний индекс...поле market_local ( локальный рынок ) доступен в поиске, поэтому, если я выполню что-то вроде:
market_local:Local
Поиск работает корректно (в евангелии от Луки).Сейчас я просматриваю код нашего анализатора, могу ли я каким-либо образом объяснить эту проблему тем фактом, что наше поисковое приложение использует Lucene 2.1.0, а последняя версия Luke использует 2.3.0?
Решение
Для отладки Lucene лучшим инструментом является Люк, который позволяет вам копаться в самом индексе, чтобы увидеть, что было проиндексировано, выполнять поиск и т.д.Я рекомендую загрузить его, указать на свой индекс и посмотреть, что там есть.
Другие советы
Тот Самый раздел на тему "Почему я не получаю обращений?" в часто задаваемых вопросах Lucene есть несколько предложений, которые могут оказаться полезными.Вы используете Field.Index.UN_TOKENIZED , поэтому для индексации не будет использоваться анализатор (я думаю).Если вы используете анализатор при поиске, то это может быть причиной вашей проблемы - анализаторы индексации и поиска должны быть одинаковыми, чтобы убедиться, что вы получаете правильные обращения.
Еще одна простая вещь, которую можно было бы сделать, - это использовать отладчик или инструкцию logging для проверки значения
StringUtils.objectToString(currClip.get("market_local"))
чтобы убедиться, что это то, что вы думаете.
Luke поставляется в комплекте с Lucene, но вы можете сказать Luke, чтобы он использовал другую версию Lucene.Скажем, "lucene-core-2.1.0.jar" содержит Lucene 2.1.0, который вы хотите использовать, а "luke.jar" содержит Luke с Lucene 2.3.0.Затем вы можете запустить Luke с помощью следующей команды.
java -путь к классу lucene-core-2.1.0.jar ;luke.jar org.getopt.luke.Luke
(Хитрость в том, чтобы поместить вашу версию Lucene перед Luke в пути к классу.Кроме того, это доступно в Windows.В Unix замените ";" на ":".)
Как вы можете проверить в Люке,
+( market_local: Локальный рынок)
переписывается в
market_local: Локальный рынок
если метод перезаписи (IndexReader) объекта запроса называется.Эти два запроса должны быть эквивалентны, поэтому в версии 2.1 может быть ошибка.Если вам нужно использовать 2.1, вы можете попробовать вручную вызвать этот метод перед передачей объекта запроса в IndexSearcher.