Устранение неполадок, связанных с игнорированием поля 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.


ОБНОВИТЬ

Установил Люк, проверял последний индекс ... Поле market_local доступно для поиска, поэтому, если я выполню что-то вроде:

market_local:Local

Поиск работает корректно (в Луке). Я сейчас просматриваю наш код анализатора, могу ли я как-нибудь списать эту проблему на то, что наше поисковое приложение использует Lucene 2.1.0, а последняя версия Luke использует 2.3.0?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
1 274
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Для отладки 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.

Другие вопросы по теме