Solr Выделить совпадающие условия запроса

Я использую Solr для нечеткого поиска (например, foo~2 bar~2). Выделение позволяет мне выделить совпадающие фрагменты документа из набора результатов.

Например:

Result 1: <em>food</em> <em> bars</em> Result 2: mars <em>bar</em>

и так далее.

Для каждого совпадения, выделенного в документе, мне нужно выяснить, с какими условиями запроса сопоставлялись эти фрагменты, а также смещения этих условий запроса в запросе. Что-то вроде:

Result 1: {<em>food</em> MATCHED_AGAINST foo QUERY_OFFSET 0,2} {<em> bars</em> MATCHED_AGAINST bar QUERY_OFFSET 3,5} Result 2: mars {<em>bar</em> MATCHED_AGAINST bar QUERY_OFFSET 3,5}

Есть ли способ сделать это в Solr?

2 ответа

Одна из возможностей - настроить Highlighter, который будет выдавать необходимую информацию. Идея проста - у вас есть метод

org.apache.lucene.search.highlight.Highlighter#getBestTextFragments

в этом методе у вас есть низкоуровневый доступ к QueryScorer, который состоит из нескольких полезных атрибутов, таких как

private Set<String> foundTerms;
private Map<String,WeightedSpanTerm> fieldWeightedSpanTerms;
private Query query;

Я почти уверен, что используя эту информацию, вы сможете получить необходимый результат

Один хак, который я мог понять, это использовать разные (уникальные) boost факторы для каждого термина в запросе, а затем извлекают коэффициенты повышения для каждого соответствующего термина из debug оценка, чтобы определить, от какого термина произошла эта оценка.

Например, мы можем запросить с foo~2^3.0 bar~2^2.0 (увеличить счет от бара на 2,0, сохранить совпадение результатов с foo нетронутым). Из вывода результатов отладки проверьте факторы повышения:

Result 1: food bars: score <total score 1> = food * 3.0 * <other scoring terms> + bars * 2.0 * <other scoring terms>
Result 2: mars bar: score <total score 2> = bar * 2.0 * <other scoring terms>

Из чего ясно, что food соответствует коэффициенту усиления 3.0, а также bars так же как bar соответствует коэффициенту усиления 2.0, Поддерживая поисковый словарь, для которого термин имел какой импульс для начала, легко выяснить, какие термины соответствовали.

Два фактора, которые следует учитывать:

  1. Если коэффициент усиления 1.0, solr debug Score не печатает его.
  2. Solr может включать некоторый коэффициент усиления по умолчанию для термина, основанный на нечетком сопоставлении, TF-IDF и т. Д. В этом случае отображаемый коэффициент усиления не будет совпадать с усилениями, которые мы указали в запросе. По этой причине нам нужно выполнить наш запрос дважды - один раз без какого-либо повышения (чтобы понять повышение по умолчанию для каждого термина) и один раз с повышением (чтобы увидеть, насколько он изменился сейчас).

Надеюсь, это кому-нибудь поможет.

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