Устранение неполадок, связанных с игнорированием Java Lucene Field - PullRequest
2 голосов
/ 04 сентября 2008

В настоящее время мы используем 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.


UPDATE

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

market_local:Local

Поиск работает корректно (в луки). Сейчас я перехожу к нашему коду анализатора. Можно ли как-нибудь объяснить эту проблему тем фактом, что наше поисковое приложение использует Lucene 2.1.0, а последняя версия Luke использует 2.3.0?

Ответы [ 4 ]

6 голосов
/ 04 сентября 2008

Для отладки Lucene лучшим инструментом для использования является Luke , который позволяет вам просматривать сам индекс, чтобы увидеть, что было проиндексировано, выполнить поиск и т. Д. ваш индекс и посмотреть, что там.

2 голосов
/ 04 сентября 2008

В разделе "Почему я не получаю хиты?" в FAQ по Lucene есть некоторые предложения, которые могут оказаться полезными. Вы используете Field.Index.UN_TOKENIZED, поэтому анализатор не будет использоваться для индексации (я думаю). Если вы используете анализатор при поиске, это может быть причиной вашей проблемы - индексирование и поиск анализаторов должны быть одинаковыми, чтобы убедиться, что вы получаете правильные результаты.

1 голос
/ 30 сентября 2008

Люк в комплекте с Lucene, но вы можете сказать Люку использовать другую версию Lucene. Скажем, «lucene-core-2.1.0.jar» содержит Lucene 2.1.0, который вы хотите использовать, а «luke.jar» содержит Luke с Lucene 2.3.0. Затем вы можете запустить Люка с помощью следующей команды.

java -classpath lucene-core-2.1.0.jar; luke.jar org.getopt.luke.Luke

(Хитрость заключается в том, чтобы поместить вашу версию Lucene перед Люком в путь к классам. Также это в Windows. В Unix замените «;» на «:».)

Как вы можете проверить в Люке,

+ (market_local: Local)

переписывается на

market_local: Местный

если , то вызывается метод rewrite (IndexReader) объекта Query . Два запроса должны быть эквивалентны, поэтому в 2.1 может быть ошибка. Если вам нужно использовать 2.1, вы можете попробовать вызвать этот метод вручную перед передачей объекта Query в IndexSearcher.

1 голос
/ 04 сентября 2008

Другой простой способ - использовать отладчик или оператор регистрации, чтобы проверить значение

StringUtils.objectToString (currClip.get ( "market_local"))

чтобы убедиться, что это то, что вы думаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...