1

我正在使用 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 中做到这一点?

4

2 回答 2

2

其中一种可能性是定制将产生所需信息的荧光笔。想法很简单——你有方法

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

在这种方法中,您可以对 QueryScorer 进行低级访问,它由几个有用的属性组成,例如

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

我很确定,使用这些信息你应该能够产生所需的输出

于 2018-12-28T13:32:17.357 回答
0

我能想到的一个技巧是为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,并且barsbar的提升因子相匹配2.0。维护一个查找字典,以查找哪个术语有什么提升,很容易找出哪些术语匹配。

需要考虑的两个因素:

  1. 如果提升因子为1.0,则 solr 调试分数不会打印出来。
  2. Solr 可能会基于模糊匹配、TF-IDF 等为术语合并一些默认的提升因子。在这种情况下,显示的提升因子将与我们在查询中提供的提升不匹配。出于这个原因,我们需要执行我们的查询两次——一次没有任何提升(了解每个术语的默认提升),一次有提升(看看它现在改变了多少)。

希望这可以帮助某人。

于 2018-12-30T04:12:54.460 回答