Solr Выделить совпадающие условия запроса - PullRequest
0 голосов
/ 18 декабря 2018

Я использую 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 ]

0 голосов
/ 30 декабря 2018

Один хак, который я мог бы выяснить, - это использовать разные (уникальные) 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 не печатает его.
  2. Solr может включать некоторый коэффициент усиления по умолчанию для термина на основе нечеткого сопоставления, TF-IDF и т. Д. В этом случае отображаемый коэффициент усиления не будетсопоставлять с бустами, которые мы указали в запросе.По этой причине нам нужно выполнить наш запрос дважды - один раз без какого-либо повышения (чтобы понять повышение по умолчанию для каждого термина) и один раз с повышением (чтобы увидеть, насколько он изменился сейчас).

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

0 голосов
/ 28 декабря 2018

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

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

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

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

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

...