Solr 突出显示匹配的查询词
Solr Highlight matching query terms
我正在使用 Solr 进行模糊搜索(例如,foo~2 bar~2
)。 Highlighting 允许我突出显示结果集中匹配的文档片段。
例如:
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 中做到这一点?
一种可能性是自定义荧光笔以生成所需的信息。想法很简单——你有方法
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
查询(将 bar 的分数提高 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
与 [=18= 的提升因子相匹配].维护一个查找字典,其中的术语有什么提升开始,很容易找出匹配的术语。
要考虑的两个因素:
- 如果提升因子是
1.0
,solr 调试分数不会打印它。
- Solr 可能会根据模糊匹配、TF-IDF 等为术语合并一些默认提升因子。在这种情况下,显示的提升因子将与我们在查询中提供的提升不匹配。出于这个原因,我们需要执行我们的查询两次 - 一次没有任何提升(了解每个术语的默认提升),一次有提升(看看它现在改变了多少)。
希望这对某人有所帮助。
我正在使用 Solr 进行模糊搜索(例如,foo~2 bar~2
)。 Highlighting 允许我突出显示结果集中匹配的文档片段。
例如:
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 中做到这一点?
一种可能性是自定义荧光笔以生成所需的信息。想法很简单——你有方法
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
查询(将 bar 的分数提高 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
与 [=18= 的提升因子相匹配].维护一个查找字典,其中的术语有什么提升开始,很容易找出匹配的术语。
要考虑的两个因素:
- 如果提升因子是
1.0
,solr 调试分数不会打印它。 - Solr 可能会根据模糊匹配、TF-IDF 等为术语合并一些默认提升因子。在这种情况下,显示的提升因子将与我们在查询中提供的提升不匹配。出于这个原因,我们需要执行我们的查询两次 - 一次没有任何提升(了解每个术语的默认提升),一次有提升(看看它现在改变了多少)。
希望这对某人有所帮助。