Устранение неполадок с игнорированием поля Java Lucene

StackOverflow https://stackoverflow.com/questions/42575

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top