Используя хайлайтер в люцене

У меня есть два вопроса относительно маркера попаданий, поставляемого с Apache Lucene:

  1. посмотрите эту функцию, не могли бы вы объяснить использование параметра потока токенов.

  2. У меня есть несколько больших документов lucene, содержащих много полей, и в каждом поле есть несколько строк. Теперь я нашел наиболее подходящий документ для конкретного запроса. Теперь этот документ найден, поскольку несколько слов в запросе могли совпадать со словами в документе. Я хочу выяснить, какие слова в запросе вызвали это. Так что для этого я планирую использовать Lucene Hit Highlighter. Пример: если запрос "skin doctor delhi" и документ с названием "dermatologist" содержит слова "skin" и "doctor", то после выделения нажатия я смогу отделить "skin" и "doctor" от запроса. Я пытался написать код для этого в течение нескольких недель. Не могу получить то, что я хочу. Не могли бы вы мне помочь, пожалуйста?

Заранее спасибо.

Обновить:

Текущий подход: я создаю запрос, содержащий все слова в документе.

Field[] field = doc.getFields("description");
String desc = "";
for (int j = 0; j < field.length; ++j) {
     desc += field[j].stringValue() + " ";
}

Query q = qp.parse(desc);
QueryScorer scorer = new QueryScorer(q, reader, "description");
Highlighter highlighter = new Highlighter(scorer);

String fragment = highlighter.getBestFragment(analyzer, "description", text);

Он работает для небольших документов, но не работает для больших документов. Следующая трассировка стека получается.

    org.apache.lucene.search.BooleanQuery$TooManyClauses: maxClauseCount is set to 1024
    at org.apache.lucene.search.BooleanQuery.add(BooleanQuery.java:152)
    at org.apache.lucene.queryParser.QueryParser.getBooleanQuery(QueryParser.java:891)
    at org.apache.lucene.queryParser.QueryParser.getBooleanQuery(QueryParser.java:866)
    at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1213)
    at org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1167)
    at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:182)

Очевидно, что такой подход нецелесообразен для больших документов. Что нужно сделать, чтобы исправить это?

Кстати, я использую FuzzyQuery соответствия.

1 ответ

Решение

РЕДАКТИРОВАТЬ: добавлены некоторые подробности о объяснить ().

Немного общего введения: Lucene Highlighter предназначен для поиска текстовых фрагментов из хитового документа и выделения токенов, соответствующих запросу.

  1. Поэтому параметр TokenStream используется для разбиения текста попадания на токены. Затем секретарь маркера подсчитывает каждый токен, чтобы оценить фрагменты и выбрать фрагменты и токены, которые будут выделены.
  2. Я считаю, что вы делаете это неправильно. Если все, что вы хотите сделать, это понять, какие термины запроса были сопоставлены в документе, вы должны использовать метод объяснения (). По сути, после того, как вы создали экземпляр поисковика, используйте:

Explanation expl = searcher.explain(query, docId);

String asText = expl.toString();

String asHtml = expl.toHtml();

docId - это необработанный идентификатор документа из результатов поиска.

Только если вам нужны фрагменты и / или блики, вы должны использовать Highlighter. Если вы все еще хотите использовать маркер, следуйте советам Николая Грихана. Остерегайтесь, однако, поскольку он описывает API Lucene 2.4.1 - Если вы используете более продвинутую версию, вы должны использовать "QueryScorer", где он говорит "SpanScorer" .

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