【问题标题】:Solr Highlight matching query termsSolr 突出显示匹配的查询词
【发布时间】:2019-05-18 19:24:00
【问题描述】:

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

【问题讨论】:

  • 可以通过自定义荧光笔完成
  • 您可以为它编写自定义代码,但不支持开箱即用。
  • 没错,我想这在Lucene 中更容易,但看起来我必须编写一个插件。希望在过去的几个版本中情况有所改变:-)
  • @Mysterion,你能告诉我我可以在这里做什么样的定制吗?

标签: solr solr-highlight


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    我能想到的一个技巧是对查询中的每个术语使用不同的(唯一的)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>
    

    从中可以清楚地看出food3.0 的提升因子匹配,bars 以及bar2.0 的提升因子匹配。维护一个查找字典,查找哪个词有什么提升,很容易找出哪些词匹配。

    需要考虑的两个因素:

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

    希望这对某人有所帮助。

    【讨论】:

    • 不幸的是,调试是不建议在生产系统上一直使用的东西
    • 好吧,这只是一个hack,它可以在不编写任何自定义代码或插件的情况下解决问题:-)
    猜你喜欢
    • 2016-04-26
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2020-07-17
    • 2016-11-30
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多