solr3.4 高亮(highlight),拼写检查(spellCheck),匹配相似(moreLikeThis) 应用实践
Solr 是基于lucene的检索服务器。能够很快的搭建检索服务,并且提供的很多实用的组件。例如 高亮(highlight)、拼写检查(spellCheck)和匹配相位(moreLikeThis)。下面我将在我工作中接触到的一些实践与大家分享。(我当前使用的solr 版本是 3.4,使用tomcat 7.0.21)
(如果你也使用的是 tomcat 服务器,而且查询请求包含中文的话,还需要 修改 TOMCAT_HOME/conf/server.xml 的 <Connector ... URIEncoding="UTF-8"/> 使用 UTF-8 编码,详见 URI_Charset_Config 和 http)
高亮(highlight)
我们经常使用搜索引擎,比如在google 搜索 java ,会出现如下结果,结果中与关键字匹配的地方是红色显示与其他内容区别开来。
solr 默认已经配置了highlight 组件(详见 SOLR_HOME/conf/sorlconfig.xml)。通常我出只需要这样请求 http://localhost:8080/solr/select?q=name:王麻子&start=0&rows=10&hl=true&hl.fl=name ,可以看到与比一般的请求多了两个参数 "hl=true" 和 "hl.fl=name" 。"hl=true" 则是开启高亮,"hl.fl=name" 则告诉solr 对 name 字段进行高亮(如果你想对多个字段进行高亮,可以继续添加字段,字段间用逗号隔开,如 "hl.fl=name,name2,name3")。
查询结果如下:
<?xml version="1.0" encoding="UTF-8"?><response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">15</int> <lst name="params"> <str name="hl">true</str> <str name="hl.fl">name</str> <str name="q">name:王麻子</str> <str name="start">0</str> <str name="rows">10</str> </lst> </lst> <!--此处是一般的返回结果--> <result name="response" numFound="1" start="0"> <doc> <str name="id">4</str> <str name="name">王麻子勤劳朴实</str> </doc> </result> <!--此处是高亮的返回结果--> <lst name="highlighting"> <!--id=4--> <lst name="4"> <!--字段name 的高亮内容--> <arr name="name"> <!--下面是经过xml转义,其实内容是 "<em>王麻子</em>勤劳朴实"--> <str><em>王麻子</em>勤劳朴实</str> </arr> </lst> </lst></response>
<searchComponent name="spellcheck" startup="lazy"> <!--默认参数--> <lst name="defaults"> <str name="spellcheck.onlyMorePopular">false</str> <str name="spellcheck.extendedResults">false</str> <!--配置拼写检查提示结果的个数(可以根据需要适当加大)--> <str name="spellcheck.count">1</str> </lst> <arr name="last-components"> <str>spellcheck</str> </arr> </requestHandler>
<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">0</int> </lst> <result name="response" numFound="0" start="0"/> <lst name="spellcheck"> <lst name="suggestions"> <lst name="王麻字"> <int name="numFound">1</int> <int name="startOffset">0</int> <int name="endOffset">3</int> <arr name="suggestion"> <str>王麻子</str> </arr> </lst> </lst> </lst> </response>
<field name="a" .../> <field name="b" .../>想对 字段 a 和 b 同时为依据进行拼写检查,我们可能再加一个 field
<field name="ab" multiValued="true" .../>然后再加两个 copyField
<copyField source="a" dest="ab" /> <copyField source="b" dest="ab" />
<field name="a" .../> <field name="b" .../><field name="ab" multiValued="true" .../><copyField source="a" dest="ab" /> <copyField source="b" dest="ab" />
<requestHandler name="/mlt" name="code"><field name="name" termVector="true" .../>