设为首页 收藏本站
查看: 1135|回复: 0

[经验分享] solr高亮(highlight),拼写检查(spellCheck),匹配相似(moreLikeThis) 应用实践

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-12 08:22:02 | 显示全部楼层 |阅读模式
Solr 是基于lucene的检索服务器。能够很快的搭建检索服务,并且提供的很多实用的组件。例如 高亮(highlight)、拼写检查(spellCheck)和匹配相位(moreLikeThis)。下面我将在我工作中接触到的一些实践与大家分享。(我当前使用的solr 版本是 3.4,使用tomcat 7.0.21)

(如果你也使用的是 tomcat 服务器,而且查询请求包含中文的话,还需要 修改 TOMCAT_HOME/conf/server.xml 的 <Connector ... URIEncoding=&quot;UTF-8&quot;/> 使用 UTF-8 编码,详见 URI_Charset_Config 和 http)

高亮(highlight)
我们经常使用搜索引擎,比如在google 搜索 java ,会出现如下结果,结果中与关键字匹配的地方是红色显示与其他内容区别开来。

DSC0000.jpg


solr 默认已经配置了highlight 组件(详见 SOLR_HOME/conf/sorlconfig.xml)。通常我出只需要这样请求http://localhost:8080/solr/select?q=name:王麻子&start=0&rows=10&hl=true&hl.fl=name ,可以看到与比一般的请求多了两个参数&quot;hl=true&quot; 和 &quot;hl.fl=name&quot; 。&quot;hl=true&quot; 则是开启高亮,&quot;hl.fl=name&quot; 则告诉solr 对 name 字段进行高亮(如果你想对多个字段进行高亮,可以继续添加字段,字段间用逗号隔开,如 &quot;hl.fl=name,name2,name3&quot;)。
查询结果如下:
Xml代码   DSC0001.png

  • <?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?>  
  • <response>  
  •   <lst name=&quot;responseHeader&quot;>  
  •     <int name=&quot;status&quot;>0</int>  
  •     <int name=&quot;QTime&quot;>15</int>  
  •     <lst name=&quot;params&quot;>  
  •       <str name=&quot;hl&quot;>true</str>  
  •       <str name=&quot;hl.fl&quot;>name</str>  
  •       <str name=&quot;q&quot;>name:王麻子</str>  
  •       <str name=&quot;start&quot;>0</str>  
  •       <str name=&quot;rows&quot;>10</str>  
  •     </lst>  
  •   </lst>  
  •   <!--此处是一般的返回结果-->  
  •   <result name=&quot;response&quot; numFound=&quot;1&quot; start=&quot;0&quot;>  
  •     <doc>  
  •       <str name=&quot;id&quot;>4</str>  
  •       <str name=&quot;name&quot;>王麻子勤劳朴实</str>  
  •     </doc>  
  •   </result>  
  •   <!--此处是高亮的返回结果-->  
  •   <lst name=&quot;highlighting&quot;>  
  •     <!--id=4-->  
  •     <lst name=&quot;4&quot;>   
  •       <!--字段name 的高亮内容-->  
  •       <arr name=&quot;name&quot;>   
  •         <!--下面是经过xml转义,其实内容是 &quot;<em>王麻子</em>勤劳朴实&quot;-->  
  •         <str>&lt;em&gt;王麻子&lt;/em&gt;勤劳朴实</str>  
  •       </arr>  
  •     </lst>  
  •   </lst>  
  • </response>  


高亮内容与关键匹配的地方,默认将会被 &quot;<em>&quot; 和 &quot;</em>&quot; 包围。如果用户想自定义高亮地方的前后标签,可以在请求中再加两个参数 &quot;hl.simple.pre&quot; 和 &quot;hl.simple.post&quot; 来分别指定前后标签,如http://localhost:8080/solr/select?q=name:王麻子&start=0&rows=10&hl=true&hl.fl=name&hl.simple.pre=<b>&hl.simple.post=</b>。或者修改solrconfig.xml 配置文件中的 highligh searchComponent 来实现。
(highlight 更多请求参数可以参考HighlightingParameters)


拼写检查(spellCheck)

首先配置 solrconfig.xml,文件可能已经有这两个元素(如果没有添加即可),需要根据我们自己的系统环境做些适当的修改。

Xml代码  

  • <searchComponent name=&quot;spellcheck&quot; class=&quot;solr.SpellCheckComponent&quot;>  
  •   <lst name=&quot;spellchecker&quot;>  
  •     <str name=&quot;name&quot;>default</str>  
  •     <!--这里指明需要根据哪个字段的索引为依据进行拼写检查。现配置 名为 name 的字段-->  
  •     <str name=&quot;field&quot;>name</str>  
  •     <!--拼写检查索引的目录-->  
  •     <str name=&quot;spellcheckIndexDir&quot;>spellchecker</str>  
  •     <!--当commit的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果)-->  
  •     <!--当然,也可以选择在optimize的时候,进行构建。那么只需要将&quot;buildOnCommint&quot;换为 &quot;buildOnOptimize&quot;-->  
  •     <str name=&quot;buildOnCommit&quot;>true</str>  
  •   </lst>  
  • </searchComponent>  
  •   
  • <requestHandler name=&quot;/spell&quot; class=&quot;solr.SearchHandler&quot; startup=&quot;lazy&quot;>  
  •   <!--默认参数-->  
  •   <lst name=&quot;defaults&quot;>  
  •     <str name=&quot;spellcheck.onlyMorePopular&quot;>false</str>  
  •     <str name=&quot;spellcheck.extendedResults&quot;>false</str>  
  •     <!--配置拼写检查提示结果的个数(可以根据需要适当加大)-->  
  •     <str name=&quot;spellcheck.count&quot;>1</str>  
  •   </lst>  
  •   <arr name=&quot;last-components&quot;>  
  •     <str>spellcheck</str>  
  •   </arr>  
  • </requestHandler>  


配置完之后,需要重新建遍索引才能有效。然后我们这以请求 http://localhost:8080/solr/spell?q=name:王麻字&spellcheck=true
查询如果如下:
Xml代码  

  • <?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?>  
  •   <response>  
  •     <lst name=&quot;responseHeader&quot;>  
  •       <int name=&quot;status&quot;>0</int>  
  •       <int name=&quot;QTime&quot;>0</int>  
  •     </lst>  
  •     <result name=&quot;response&quot; numFound=&quot;0&quot; start=&quot;0&quot;/>  
  •     <lst name=&quot;spellcheck&quot;>  
  •       <lst name=&quot;suggestions&quot;>  
  •         <lst name=&quot;王麻字&quot;>  
  •           <int name=&quot;numFound&quot;>1</int>  
  •           <int name=&quot;startOffset&quot;>0</int>  
  •           <int name=&quot;endOffset&quot;>3</int>  
  •           <arr name=&quot;suggestion&quot;>  
  •             <str>王麻子</str>  
  •           </arr>  
  •         </lst>  
  •       </lst>  
  •     </lst>  
  •   </response>  


有时候我们需要以多个字段为依据进行拼写检查,但上面的配置只能设一个字段。为了达到同样的效果,我能只能另行其道了。需要用到 coptyField 技术。比如我们在 schema.xml 中定义了Xml代码  

  • <field name=&quot;a&quot; .../>   
  • <field name=&quot;b&quot; .../>  
想对 字段 a 和 b 同时为依据进行拼写检查,我们可能再加一个 fieldXml代码  

  • <field name=&quot;ab&quot; multiValued=&quot;true&quot; .../>  
  然后再加两个 copyField
Xml代码  

  • <copyField source=&quot;a&quot; dest=&quot;ab&quot; />   
  • <copyField source=&quot;b&quot; dest=&quot;ab&quot; />  

完整的配置如下:
Xml代码  

  • <field name=&quot;a&quot; .../>   
  • <field name=&quot;b&quot; .../>  
  • <field name=&quot;ab&quot; multiValued=&quot;true&quot; .../>  
  • <copyField source=&quot;a&quot; dest=&quot;ab&quot; />   
  • <copyField source=&quot;b&quot; dest=&quot;ab&quot; />  

然后配置 SpellCheckComponent 的字段为 ab 即可。
(更详细的内容可以参考 SpellCheckComponent)


匹配相&#20284;(moreLikeThis)
他的作用是查找相&#20284;的document。

首先在 solrconfig.xml 中配置 MoreLikeThisHandler
Xml代码  

  • <requestHandler name=&quot;/mlt&quot; class=&quot;solr.MoreLikeThisHandler&quot;>  
  • </requestHandler>  

然后我就可以请求 http://localhost:8080/solr/mlt?q=id:7&mlt.true&mlt.fl=name&mlt.mintf=1&mlt.mindf=1
上面请求的意思 查找 id 为 7 的 document ,然后返回与此 document 在 name 字段上相&#20284;的其他 document。需要注意的是 mlt.fl 中的 field 的 termVector=true 才有效果
Xml代码  

  • <field name=&quot;name&quot; termVector=&quot;true&quot; .../>  

当然 mlt.fl 也可以添加多个field ,用逗号隔开就行了
(详细说明可参考 MoreLikeThis MoreLikeThisHandler)

  • DSC0002.jpg
  • 大小: 28.1 KB

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138100-1-1.html 上篇帖子: solr中SearchComponent(查询组件)及其自定义 下篇帖子: tomcat中搭建solr Cloud、日志、多Core以及常见问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表