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"><em></str>
<str name="hl.tag.post"></em></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