Lucene Highlighter не совпадает с префиксами
Я использую Highlighter 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 для поиска, просто для выделения.
Как мне создать IndexReader и возможно ли его создать, если я использую Lucene таким, какой я есть. Или, возможно, есть другой способ выделить совпадения префиксов? Я очень новичок в Lucene, и я уверен, что все эти части делают или если они все необходимы. Я только что скопировал их из различных примеров, которые я нашел в Интернете. Так что, если я делаю что-то еще не так, пожалуйста, дайте мне знать. Благодарю.
1 ответ
Предположим, у вас есть запрос field:abc*
, Какие query.rewrite
в основном делает это: он читает индекс (вот почему вам нужен IndexReader) находит все термины, которые начинаются с abc
и изменяет ваш запрос как , например, field:abc1 field:abc2 field:abc3
, Если вы знаете расположение индекса, вы можете использовать IndexReader.Open
чтобы получить IndexReader. Если у вас вообще нет индекса, вам следует поискать pText
найти все слова, которые начинаются с abc
и обновите ваш запрос соответственно.