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"><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
1.7.6 Highlighting-高亮的更多相关文章
- 为Python配置Vim编辑器(GUI/非GUI皆可)
原文地址:https://blog.csdn.net/alanzjl/article/details/49383943 Vim as a python IDE ** 最近一直在写Python,但一直没 ...
- Java High Level REST Client 中文API(仅供参考)
1.初始化 兼容性 Java High Level REST Client需要Java 1.8,并依赖于Elasticsearch核心项目,客户端版本与客户端开发的Elasticsearch版本相同, ...
- 安装ik分词插件
下载IK安装包 https://github.com/medcl/elasticsearch-analysis-ik https://github.com/medcl/elasticsearch-an ...
- solr特点一:高亮(highlighting)
高亮的配置 参数详细说明: hl.fl: 用空格或逗号隔开的字段列表.要启用某个字段的highlight功能,就得保证该字段在schema中是stored.如果该参数未被给出,那么就会高亮默认字段 s ...
- unity中使用Highlighting System v4.0插件给物体添加高亮
插件:Highlighting System v4.0 操作:在摄像机上挂上HighlightingRenderer脚本 脚本目录在\Assets\Plugins\HighlightingSystem ...
- Python GUI 背景色与语法高亮主题配置
[补充] Python GUI 中 :ALT+P 可以重复上一条命令. ---------------------------------------------------------------- ...
- 12款最佳的 WordPress 语法高亮插件推荐
语法高亮工具增强了代码的可读性,美化了代码,让程序员更容易维护.语法高亮提供各种方式由以提高可读性和文本语境,尤其是对于其中可以结束跨越多个页面的代码,以及让开发者自己的程序中查找错误.在这篇文章中, ...
- Java基础之扩展GUI——高亮元素、上下文菜单、移动旋转元素、自定义颜色(Sketcher 10)
窗口应用程序. 本例在上一版的基础上实现了高亮元素.移动元素.上下文菜单.旋转元素.设置自定义颜色. 1.自定义常量包: // Defines application wide constants p ...
- Unity中Mesh分解与边缘高亮加上深度检测
一个比较简单的需求,不过遇到些坑,记录下. 房间有多个模型,每个模型可能多个SubMesh,点击后,需要能具体到是那个SubMesh,并且在这个SubMesh上显示边缘高光,以及能个性这单个SubMe ...
- Highlighting System
Highlighting System 法线贴图漫反射着色器 Unity论坛:http://forum.unity3d.com/threads/143043-Highlighting-System-R ...
随机推荐
- ACM 数论小结 2014-08-27 20:36 43人阅读 评论(0) 收藏
断断续续的学习数论已经有一段时间了,学得也很杂,现在进行一些简单的回顾和总结. 学过的东西不能忘啊... 1.本原勾股数: 概念:一个三元组(a,b,c),其中a,b,c没有公因数而且满足:a^2+b ...
- invoking gdb
[invoking gdb] The most usual way to start gdb is with one argument, specifying an executable progra ...
- redis缓存数据表
直观上看,数据库中的数据都是按表存储的:更微观地看,这些表都是按行存储的.每执行一 次select查询,数据库都会返回一个结果集,这个结果集由若干行组成.所以,一个自然而然 的想法就是在Redis中找 ...
- 根据路径获得文件名以及Aspose.Cells.dll操作excel 以及使用iTextSharp.text.pdf.PdfReader.dll对PDF的操作
string result = Regex.Match(str,@"[^\\]+$").Value;//正则表达式 this.listBox1.Items.Add(Path.Get ...
- How Tomcat Works(十)
本文接下来分析tomcat的日志记录器,日志记录器是用来记录消息的组件,在tomcat中,日志记录器需要与某个servlet容器相关连:在org.apache.catalina.logger包下,to ...
- thinkphp 防止sql注入
防止SQL注入 对于WEB应用来说,SQL注入攻击无疑是首要防范的安全问题,系统底层对于数据安全方面本身进行了很多的处理和相应的防范机制,例如: $User = M("User") ...
- iOS设置导航栏样式(UINavigationController)
//设置导航栏baritem和返回baiitem样式 UIBarButtonItem *barItem = [UIBarButtonItem appearance]; //去掉返回按钮上的字 [bar ...
- My集合框架第二弹 二叉树的实现
package com.wpr.collection; import java.util.NoSuchElementException; public class BinarySearchTree&l ...
- Spring中使用Hibernate
在context中定义DataSource,创建SessionFactoy,设置参数: DAO类继承HibernateDaoSupport,实现具体接口,从中获得HibernateTemplate进行 ...
- Expression<Func<T,TResult>>和Func<T,TResult> 与AOP与WCF
1>>Expression<Func<T,TResult>>和Func<T,TResult>http://www.cnblogs.com/xcsn/p/ ...