#java #lucene #lucene-highlighter
#java #lucene #lucene-маркер
Вопрос:
Я использую маркер Lucene для выделения частей строки. Приведенный ниже код, похоже, отлично работает для поиска слов-основ, но не для сопоставления префиксов.
EnglishAnalyzer analyzer = new EnglishAnalyzer(Version.LUCENE_34);
QueryParser parser = new QueryParser(Version.LUCENE_30, "", analyzer);
Query query = parser.parse(pQuery);
QueryScorer scorer = new QueryScorer(query);
Fragmenter fragmenter = new SimpleSpanFragmenter(scorer, 40);
Highlighter highlighter = new Highlighter(scorer);
highlighter.setTextFragmenter(fragmenter);
String[] frags = highlighter.getBestFragments(analyzer, "", pText, 4);
Я читал в нескольких разных местах, что мне нужно вызвать Query.rewrite, чтобы заставить соответствие префикса работать. Однако этот метод использует аргумент IndexReader, и я не уверен, как его получить. Я обнаружил, что во всех примерах, вызывающих Query.rewreite, не показано, откуда взялся IndexReader. Я добавлю, что это единственный код Lucene, который я использую. Я не использую Lucene для выполнения самого поиска, только для выделения.
Как мне создать средство чтения индексов и возможно ли его создать, если я использую Lucene таким, какой я есть. Или, возможно, есть другой способ заставить его выделять совпадения префиксов? Я очень новичок в Lucene и я уверен, что все эти части делают и все ли они необходимы. Я только что скопировал их из различных примеров, которые я нашел в Интернете. Так что, если я делаю что-то еще неправильно, пожалуйста, дайте мне знать. Спасибо.
Ответ №1:
Предположим, у вас есть запрос field:abc*
. Что query.rewrite
в основном делает это: он считывает индекс (вот почему вам нужен IndexReader), находит все термины, начинающиеся с abc
, и изменяет ваш запрос как , например, field:abc1 field:abc2 field:abc3
. Если вы знаете местоположение индекса, вы можете использовать IndexReader.Open
для получения средства чтения индексов. Если у вас вообще нет индекса, вам следует выполнить поиск pText
, найти все слова, начинающиеся с abc
, и соответствующим образом обновить свой запрос.
Комментарии:
1. Да, у меня нет индекса. Это весь код Lucene, который у меня есть во всем моем приложении. Итак, как только я найду все позиции расположения этого слова в pText, что именно я должен вызвать, чтобы обновить мой объект запроса этой информацией?
2. вам не нужны местоположения / positions, просто найдите слова, добавьте в список / массив, затем создайте строку запроса типа
field:abc1 field:abc2 field:abc3
и передайте ее анализатору запросов.