Вопрос

У меня есть два вопроса относительно hit highlighter, поставляемого с apache lucene:

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

  2. У меня есть несколько больших документов lucene, содержащих множество полей, и в каждом поле есть несколько строк.Теперь я нашел наиболее релевантный документ для конкретного запроса.Теперь этот документ был найден, потому что несколько слов в запросе могли совпадать со словами в документе.Я хочу выяснить, какие слова в запросе вызвали это.Поэтому для этого я планирую использовать Lucene Hit Highlighter.Пример:если запрос "skin doctor delhi" и документ под названием "дерматолог" содержит слова "кожа" и "доктор", то после выделения я должен быть в состоянии выделить "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 matching.

Это было полезно?

Решение

Редактировать:добавлены некоторые подробности о explain().

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

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

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

String asText = expl.toString();

String asHtml = expl.toHtml();

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

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

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