1.7.6 Highlighting-高亮

时间:2024-06-04 19:06:50

1 高亮

  solr的高亮允许匹配用户查询的文档的片段包含在查询响应中返回,高亮包含在返回结果的单独部分(highlighting部分).

  solr提供了一个高亮工具的集合,这个工具允许控制大量字段的片段,片段的大小和片段的格式.高亮工具还可以被多种请求处理程序(Request Handler)调用,如DisMax,Extend DisMax,和标准查询解析器.

  这里有三种可以使用的高亮实现:

  Standard Highlighter:这个standard highlighter是高亮的一个典型.它拥有三个高亮的最复杂的和最细粒度的查询表示法.比如,高亮能够提供精确的匹配,甚至用于如surround这样的查询解析器.它不要求任何的特殊的数据结果如termVectors.对于一个宽泛种类的搜索情况,这是一个很好的选择.

  FastVector Highlighter: FastVector Highlighter要求字段的term vector选项(termVectors,termPositions,termOffsets).并考虑到是最优化的,对于多语言环境它往往比standard highlighter会更好的工作.因为它支持Unicode breakiterators(分解迭代).另一方面,它的查询表示没有standard highlighter那么高级.例如,它将不会很好的工作于surround解析器.它经常使用于大文档和多种类语言的高亮文本.

  Postings Highlighter:Postings Highlighter要求存储storeOffsetsWithPositions(位置偏移量),需要在字段中配置.这是一个比vectors更简单有效的结果,但是不适合于大数量的查询terms.像FastVector Highlighter,它支持Unicode算法来分割文档.另一方面,它有很粗略的查询表示:它注重于摘要的质量,完全忽略查询的结构,仅仅基于查询term和统计排序.

1.1 高亮配置

   高亮配置,无论选择哪个实现,首先需要在配置一个搜索组件,然后关联这个组件.

   用于搜索组件的确切参数主要取决于所依赖的实现,在默认的solrconfig.xml中有一个稳健的例子,这个例子包含了如何配置Standard Highlighte和FastVector Highlighter.(参考Postings Highlighter部分了解更多关于配置的细节).

1.2 Standard Highlighter

  标准高亮不要求任何特别的参数加载字段之上.尽管如此,你可以选择的对每个高亮字段打开termVectors,termPositions和termOffsets.这可以避免在查询时通过分析链(analysis chain)运行文档,可以使更快高亮.

 标准高亮参数,这些参数可以定义在高亮搜索组件中,在request handler中指定默认参数.或者通过query传递给request handler.

 1.2.1 hl :默认为空白(不高亮).为true时,开启高亮功能,为false或者空白或者缺少时,关闭高亮功能.

1.2.2 hl.q:默认空白. 为高亮指定一个覆盖的查询term.如果指定hl.q,高亮将使用这个查询term,而不是主查询term.

 1.2.3 hl.fl:默认空白.

      指定高亮字段列表.多个字段之间以逗号或空格分开.如果为空白,对于StandardRequestHandler,高亮默认搜索字段(或者指定的df参数).对于      

    DisMaxRequestHandler,qf作为默认的."*"可以用于匹配全局,如"text_*"或者"*",当使用"*"时,hl.requireFieldMatch=true必填.

 1.2.4    hl.snippets : 默认为1.指定每个字段生成的高亮字段的最大数量.

 1.2.5    hl.fragsize : 每个snippet返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。大字段时不会这么做。

1.2.6    hl.mergeContiguous : 默认为false. 知识solr将邻近相连的片段合并为一个单独的片段.true表示合并.默认值为false,为向后兼容设置.

 1.2.7    hl.requireFieldMatch: 默认为fasle. 如果置为true,除非该字段的查询结果不为空才会被高亮。它的默认值是false,意味 着它可能匹配某个字段却高亮一个不同

     的字段。如果hl.fl使用了通配符,那么就要启用该参数。尽管如此,如果你的查询是all字段(可能是使用 copy-field 指令),那么还是把它设为false,这样搜索结果

       能表明哪个字段的查询文本未被找到

 1.2.8    hl.maxAnalyzedChars: 默认51200. 会搜索高亮的最大字符,默认值为51200,如果你想禁用,设为-1

 1.2.9    hl.maxMultiValuedToExamine: 默认integer.MAX_VALUE.在停止之前,指定检查的多值字段的最大条木数.在任何匹配没有找到之前,如果达到限制,可能会返回

       0个结果.

 1.2.10  hl.maxMultiValuedToMatch: 默认integer.MAX_VALUE.在停止之前,指定在多值字段中找到的最大匹配数.如果hl.maxMultiValuedToExamine也已经定义

      了,whichever limit is reached first will determine when to stop looking.

 1.2.11  hl.alternateField: 默认blank.如果没有生成snippet(没有terms 匹配),那么使用另一个字段值作为返回。

 1.2.12  hl.maxAlternateFieldLength :默认 unlimited.如果hl.alternateField启用,则有时需要制定alternateField的最大字符长度,默认0是即没有限制。所以合理的

       值是应该为hl.snippets * hl.fragsize这样返回结果的大小就能保持一致。

 1.2.13  hl.formatter :默认 simple.一个提供可替换的formatting算法的扩展点。默认值是simple,这是目前仅有的选项。显然这不够用,你可 以看看

      org.apache.solr.highlight.HtmlFormatter.java 和 solrconfig.xml中highlighting元素是如何配置的。 注意在不论原文中被高亮了什么值的情况下,如预先已存在

      的em tags,也不会被转义,所以在有时会导致假的高亮。

 1.2.14  hl.simple.pre  hl.simple.post : 默认<em> and </em> .

 1.2.15  hl.fragmenter : 默认gap.这个是solr制定fragment算法的扩展点。gap是默认值。regex是另一种选项,这种选项指明 highlight的边界由一个正则表达式确

      定。这是一种非典型 的高级选项。为了知道默认设置和fragmenters (and formatters)是如何配置的,可以看看solrconfig.xml中的highlight段。

 1.2.16  hl.usePhraseHighlighter :默认true.如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮

 1.2.17  hl.highlightMultiTerm  : 默认true.如果设置为true,solr将会高亮出现在多terms查询中的短语.

 1.2.18  hl.regex.slop:默认0.6.在使用hl.fragmenter=regex时,意思是如果hl.fragsize=100那么fragment的大小会从40-160.

 1.2.19 hl.regex.pattern: 默认空白.为fragmenting指定正则表达式.这个可以用作提取句子.

 1.2.20 hl.regex.maxAnalyzedChars:默认10000. 搜索高亮的最大字符,对一个大字段使用一个复杂的正则表达式是非常昂贵的.

 1.2.21 hl.preserveMulti :默认false.如果为true,多值字段将会按照它们在索引中顺序返回所有的值.如果false,只有匹配高亮请求的值返回.

相关内容:

  HighlightingParameters from the Solr wiki
  Highlighting javadocs

1.3 FastVector Highlighter

  FastVectorHighlighter是一个基于TermVector的高亮工具.在很多情况中,它提供了比标准高亮更高的性能.要使用FastVectorHighlighter,需要设置hl.useFastVectorHighlighter参数为true.

  必须对每个高亮字段打开termVectors,termPositions,termOffsets.最后你需要使用一个界限扫描器来阻止FastVectorHighlighter截取你得terms.在大多数例子中,使用breakIterator边界扫描器将会给出一个更精确的结果.参考Using Boundary Scanners with the Fast Vector Highlighter获取更多的详细信息.

 1.3.1 FastVector 高亮参数

  下面是这个高亮的参数,大部分重复了standard highlighter的参数.这些参数可以在高亮搜索组件中定义.作为指定request handler的默认参数.或者使用查询query传递给request handler.

  hl : 默认为空白(不高亮).为true时,开启高亮功能,为false或者空白或者缺少时,关闭高亮功能.

  hl.useFastVectorHighligter:默认false. true:开启FastVector Highlighter.

  hl.q:默认空白.覆盖高亮查询term.如果指定这个参数,将会覆盖主查询term.

  hl.fl:默认空白.

      指定高亮字段列表.多个字段之间以逗号或空格分开.如果为空白,对于StandardRequestHandler,高亮默认搜索字段(或者指定的df参数).对于      

    DisMaxRequestHandler,qf作为默认的."*"可以用于匹配全局,如"text_*"或者"*",当使用"*"时,hl.requireFieldMatch=true必填.

  hl.snippets:默认为1.指定每个字段生成的高亮字段的最大数量.

  hl.fragsize:每个snippet返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。大字段时不会这么做。

  hl.requireFieldMatch:默认false.如果置为true,除非该字段的查询结果不为空才会被高亮。它的默认值是false,意味 着它可能匹配某个字段却高亮一个不同的字段。

  如果hl.fl使用了通配符,那么就要启用该参数。尽管如此,如果你的查询是all字段(可能是使用 copy-field 指令),那么还是把它设为false,这样搜索结果能表明哪个字段

  的查询文本未被找到

   hl.maxMultiValuedToExamine: 默认integer.MAX_VALUE.在停止之前,指定检查的多值字段的最大条木数.在任何匹配没有找到之前,如果达到限制,可能会返回

       0个结果.

   hl.maxMultiValuedToMatch: 默认integer.MAX_VALUE.在停止之前,指定在多值字段中找到的最大匹配数.如果hl.maxMultiValuedToExamine也已经定义

      了,whichever limit is reached first will determine when to stop looking.

   hl.alternateField: 默认blank.如果没有生成snippet(没有terms 匹配),那么使用另一个字段值作为返回。

   hl.maxAlternateFieldLength :默认 unlimited.如果hl.alternateField启用,则有时需要制定alternateField的最大字符长度,默认0是即没有限制。所以合理的

       值是应该为hl.snippets * hl.fragsize这样返回结果的大小就能保持一致。

  hl.tag.pre hl.tag.post:默认 <em> and </em>.高亮html标签

  hl.phraseLimit:默认为integer.MAX_VALUE.为了提高FastVectorHighlighter的性能,可以对短语的数量做一个限制用于高亮分析.

  hl.usePhraseHighlighter:默认为true.如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。

  hl.preserveMulti:默认false.如果为true,多值字段将会按照它们在索引中顺序返回所有的值.如果false,只有匹配高亮请求的值返回.

  hl.fragListBuilder:默认为weighted.片段分割算法.weighted 的fragListBuilder使用IDF-weighted排序片段.其他的选项是single.返回整个字段内容作为一个片段.

  或者是simple.使用这个参数你可以选择一个fragListBuilder.或者是修改一个在solrconfig.xml中已存在的实现,通过添加default=true来作为默认操作.

  hl.fragmentsBuilder:默认为default 碎片生成器(fragment builder)主要用于格式化碎片,这些碎片默认使用<em>和</em>来标记.

1.3.2 Using Boundary Scanners with the Fast Vector Highlighter

  和Fast Vector Highlighter 一起使用边界扫描器.

   这个 Fast vector highlight 偶尔会截短高亮词语.为了防止这种情况,在solrconfig.xml中实现一个边界扫描器.然后使用hl.boundaryScanner参数来指定高亮使用的边界扫描器.

  solr支持两种边界扫描器:breakIterator和simple.

  1.3.2.1 breakIterator

    界扫描器提供出色的性能,一开始就考虑本地和边界类型在内.在多数例子中使用breakIterator边界扫描器.为了实现这个breakIterator边界扫描器,将下面代码加入到solrconfig.xml文件中的highlighting部分.调整类型,语言,国家.

<boundaryScanner name="breakIterator"
class="solr.highlight.BreakIteratorBoundaryScanner">
<lst name="defaults">
<str name="hl.bs.type">WORD</str>
<str name="hl.bs.language">en</str>
<str name="hl.bs.country">US</str>
</lst>
</boundaryScanner>

    hl.bs.type参数的可能值是:WORD, LINE, SENTENCE, 和 CHARACTER.

  1.3.2.1 simple

  simple边界扫描器通过一个指定的最大字符数值(hl.bs.maxScan)和常用的分隔符(hl.bs.chars)来 扫描term边界.

<boundaryScanner name="simple"
class="solr.highlight.SimpleBoundaryScanner" default="true">
<lst name="defaults">
<str name="hl.bs.maxScan">10</str>
<str name="hl.bs.chars">.,!?\t\n</str>
</lst>
</boundaryScanner>

关联内容:

  HighlightingParameters from the Solr wiki
  Highlighting javadocs

1.4 Postings Highlighter

  PostingsHighlighter比较关注好的文档摘要和效率,但是没有其他高亮工具灵活.它使用比价少的硬盘空间,专注好的文档摘要,提供一个高性能方法,如果相对于每页结果数查询有一个较低的terms数.但是,缺点就是它不是一个匹配debugger的查询,it does not allow broken analysis chains.

  要使用这个高亮,必须打开字段的storeOffsetsWithPositions参数,不需要打开字段的termVectors,termPositions,termOffsets.因为这个高亮器不使用term向量.

 1.4.1 Configuring Postings Highlighter

  在solrconfig.xml中配置posting highlighter.

  首先定义搜索组件:

<searchComponent class="solr.HighlightComponent" name="highlight">
<highlighting class="org.apache.solr.highlight.PostingsSolrHighlighter" />
</searchComponent>

  在这个例子中,我们命名了一个highlight组件,如果你使用的是默认的solrconfig.xml文件,那么你已经有了一个这样名字的组件.你或者使用上面的组件替换掉默认的组件,或者

重命名已有的组件.

  然后在request handler中,定义为默认高亮组件:

<requestHandler name="standard" class="solr.StandardRequestHandler">
<lst name="defaults">
<int name="hl.snippets">1</int>
<str name="hl.tag.pre">&lt;em&gt;</str>
<str name="hl.tag.post">&lt;/em&gt;</str>
<str name="hl.tag.ellipsis">... </str>
<bool name="hl.defaultSummary">true</bool>
<str name="hl.encoder">simple</str>
<float name="hl.score.k1">1.2</float>
<float name="hl.score.b">0.75</float>
<float name="hl.score.pivot">87</float>
<str name="hl.bs.language"></str>
<str name="hl.bs.country"></str>
<str name="hl.bs.variant"></str>
<str name="hl.bs.type">SENTENCE</str>
<int name="hl.maxAnalyzedChars">10000</int>
</lst>
</requestHandler>

  这个例子展示了每个参数的默认值,如果你打算保留这些默认值,可以不添加这些参数.

1.4.2 Postings Highlighter Parameters

参数 默认值 描述
hl 空白(不高亮) 为true时,开启高亮功能,为false或者空白或者缺少时,关闭高亮功能.
hl.q 空白 覆盖高亮查询term.如果指定这个参数,将会覆盖主查询term.
hl.fl 空白 指定高亮字段列表.多个字段之间以逗号或空格分开.如果为空白,对于StandardRequestHandler,高亮默认搜索字段(或者指定的df参数).对于          DisMaxRequestHandler,qf作为默认的."*"可以用于匹配全局,如"text_*"或者"*",当使用"*"时,hl.requireFieldMatch=true必填
hl.snippets 1 指定每个字段生成的高亮字段的最大数量.
hl.tag.pre <em> 高亮html标签前缀
hl.tag.post </em> 高亮html标签后缀
hl.tag.ellipsis "... " 在结果片段中连接两个不连接的短语.
hl.maxAnalyzedChars 10000 指定solr应该查找的合适的片段所在文档的字符数量.
hl.multiValuedSeparatorChar " "(空格) 指定多值字段之间的逻辑分隔符
hl.defaultSummary true true,如果高亮没有匹配短文,字段将有一个默认摘要.
hl.encoder simple 定义结果字段的编码,simple值不转义,html将会转义内容中的html标签.
hl.score.k1 1.2 标志BM25  term 规范化参水k1,例如,可以设置为0,说明只基于匹配的term数量排序短文
hl.score.b 0.75 标志BM25  长度的规范化参水b,例如,可以设置为0,说明在排序时忽略短文长度.
hl.score.pivot 87 指定BM25的平均长度(字符数)
hl.bs.language 空白 指定breakiterator的语言,用来分隔文档成短文片段.
hl.bs.country 空白 指定breakiterator的国家,用来分隔文档成短文片段.
hl.bs.variant 空白 指定breakiterator的变种,用来分隔文档成短文片段.
hl.bs.type SENTENCE 指定breakiterator的类型,用来分隔文档成短文片段.可以是SENTENCE,WORD CHARACTER LINE WHOLE.

相关主题:

  PostingsHighlighter from the Solr wiki
  PostingsSolrHighlighter javadoc