惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
L
LangChain Blog
博客园_首页
J
Java Code Geeks
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
WordPress大学
WordPress大学
V
Visual Studio Blog
T
The Blog of Author Tim Ferriss
U
Unit 42
酷 壳 – CoolShell
酷 壳 – CoolShell
Recent Announcements
Recent Announcements
C
Check Point Blog
IT之家
IT之家
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
D
Docker
有赞技术团队
有赞技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
阮一峰的网络日志
阮一峰的网络日志
I
InfoQ

博客园 - searchDM

Elasticsearch 集成 Elasticsearch 环境 Elasticsearch 优化 Elasticsearch入门 Elasticsearch概述 吴恩达自然语言处理第一课:分类与向量空间 Linux下C语言字符串操作之字符串转数值型 lucene 3.4 contrib/facet 切面搜索 在ubuntu上安装全文搜索中文分词Coreseek/sphinx及和Rails集成 堆与堆排序 Trie树|字典树的简介及实现 快速排序 归并排序的实现 Lucene.net搜索结果排序(单条件和多条件) 直接选择排序及交换二个数据的实现 冒泡排序 直接插入排序的三种实现 希尔排序的实现 几乎所有食物的英文翻译
solr3.4 高亮(highlight),拼写检查(spellCheck),匹配相似(mor...
searchDM · 2011-10-17 · via 博客园 - searchDM

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_Confighttp)

高亮(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代码  收藏代码

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <response>  
  3.   <lst name="responseHeader">  
  4.     <int name="status">0</int>  
  5.     <int name="QTime">15</int>  
  6.     <lst name="params">  
  7.       <str name="hl">true</str>  
  8.       <str name="hl.fl">name</str>  
  9.       <str name="q">name:王麻子</str>  
  10.       <str name="start">0</str>  
  11.       <str name="rows">10</str>  
  12.     </lst>  
  13.   </lst>  
  14.   <!--此处是一般的返回结果-->  
  15.   <result name="response" numFound="1" start="0">  
  16.     <doc>  
  17.       <str name="id">4</str>  
  18.       <str name="name">王麻子勤劳朴实</str>  
  19.     </doc>  
  20.   </result>  
  21.   <!--此处是高亮的返回结果-->  
  22.   <lst name="highlighting">  
  23.     <!--id=4-->  
  24.     <lst name="4">   
  25.       <!--字段name 的高亮内容-->  
  26.       <arr name="name">   
  27.         <!--下面是经过xml转义,其实内容是 "<em>王麻子</em>勤劳朴实"-->  
  28.         <str>&lt;em&gt;王麻子&lt;/em&gt;勤劳朴实</str>  
  29.       </arr>  
  30.     </lst>  
  31.   </lst>  
  32. </response>  

高亮内容与关键匹配的地方,默认将会被 "<em>" 和 "</em>" 包围。如果用户想自定义高亮地方的前后标签,可以在请求中再加两个参数 "hl.simple.pre" 和 "hl.simple.post" 来分别指定前后标签,如 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代码  收藏代码

  1. <searchComponent name="spellcheck" class="solr.SpellCheckComponent">  
  2.   <lst name="spellchecker">  
  3.     <str name="name">default</str>  
  4.     <!--这里指明需要根据哪个字段的索引为依据进行拼写检查。现配置 名为 name 的字段-->  
  5.     <str name="field">name</str>  
  6.     <!--拼写检查索引的目录-->  
  7.     <str name="spellcheckIndexDir">spellchecker</str>  
  8.     <!--当commit的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果)-->  
  9.     <!--当然,也可以选择在optimize的时候,进行构建。那么只需要将"buildOnCommint"换为 "buildOnOptimize"-->  
  10.     <str name="buildOnCommit">true</str>  
  11.   </lst>  
  12. </searchComponent>  
  13.   
  14. <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">  
  15.   <!--默认参数-->  
  16.   <lst name="defaults">  
  17.     <str name="spellcheck.onlyMorePopular">false</str>  
  18.     <str name="spellcheck.extendedResults">false</str>  
  19.     <!--配置拼写检查提示结果的个数(可以根据需要适当加大)-->  
  20.     <str name="spellcheck.count">1</str>  
  21.   </lst>  
  22.   <arr name="last-components">  
  23.     <str>spellcheck</str>  
  24.   </arr>  
  25. </requestHandler>  

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

Xml代码  收藏代码

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   <response>  
  3.     <lst name="responseHeader">  
  4.       <int name="status">0</int>  
  5.       <int name="QTime">0</int>  
  6.     </lst>  
  7.     <result name="response" numFound="0" start="0"/>  
  8.     <lst name="spellcheck">  
  9.       <lst name="suggestions">  
  10.         <lst name="王麻字">  
  11.           <int name="numFound">1</int>  
  12.           <int name="startOffset">0</int>  
  13.           <int name="endOffset">3</int>  
  14.           <arr name="suggestion">  
  15.             <str>王麻子</str>  
  16.           </arr>  
  17.         </lst>  
  18.       </lst>  
  19.     </lst>  
  20.   </response>  

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

Xml代码  收藏代码

  1. <field name="a" .../>   
  2. <field name="b" .../>  

想对 字段 a 和 b 同时为依据进行拼写检查,我们可能再加一个 field

Xml代码  收藏代码

  1. <field name="ab" multiValued="true" .../>  

  然后再加两个 copyField

Xml代码  收藏代码

  1. <copyField source="a" dest="ab" />   
  2. <copyField source="b" dest="ab" />  

完整的配置如下:

Xml代码  收藏代码

  1. <field name="a" .../>   
  2. <field name="b" .../>  
  3. <field name="ab" multiValued="true" .../>  
  4. <copyField source="a" dest="ab" />   
  5. <copyField source="b" dest="ab" />  

(更详细的内容可以参考 SpellCheckComponent)

匹配相似(moreLikeThis)
他的作用是查找相似的document。

首先在 solrconfig.xml 中配置 MoreLikeThisHandler

Xml代码  收藏代码

  1. <requestHandler name="/mlt" class="solr.MoreLikeThisHandler">  
  2. </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 字段上相似的其他 document。需要注意的是 mlt.fl 中的 field 的 termVector=true 才有效果

Xml代码  收藏代码

  1. <field name="name" termVector="true" .../>  

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