1.7.6 Highlighting-高亮

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.snippets1指定每个字段生成的高亮字段的最大数量.
hl.tag.pre<em>高亮html标签前缀
hl.tag.post</em>高亮html标签后缀
hl.tag.ellipsis"... "在结果片段中连接两个不连接的短语.
hl.maxAnalyzedChars10000指定solr应该查找的合适的片段所在文档的字符数量.
hl.multiValuedSeparatorChar" "(空格)指定多值字段之间的逻辑分隔符
hl.defaultSummarytruetrue,如果高亮没有匹配短文,字段将有一个默认摘要.
hl.encodersimple定义结果字段的编码,simple值不转义,html将会转义内容中的html标签.
hl.score.k11.2标志BM25  term 规范化参水k1,例如,可以设置为0,说明只基于匹配的term数量排序短文
hl.score.b0.75标志BM25  长度的规范化参水b,例如,可以设置为0,说明在排序时忽略短文长度.
hl.score.pivot87指定BM25的平均长度(字符数)
hl.bs.language空白指定breakiterator的语言,用来分隔文档成短文片段.
hl.bs.country空白指定breakiterator的国家,用来分隔文档成短文片段.
hl.bs.variant空白指定breakiterator的变种,用来分隔文档成短文片段.
hl.bs.typeSENTENCE指定breakiterator的类型,用来分隔文档成短文片段.可以是SENTENCE,WORD CHARACTER LINE WHOLE.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关主题:

  PostingsHighlighter from the Solr wiki
  PostingsSolrHighlighter javadoc

 

转载于:https://www.cnblogs.com/a198720/p/4344231.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值