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