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

推荐订阅源

T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
L
LINUX DO - 热门话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
V
V2EX
GbyAI
GbyAI
量子位
Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
B
Blog
Microsoft Security Blog
Microsoft Security Blog
S
SegmentFault 最新的问题
O
OpenAI News
N
News and Events Feed by Topic
博客园 - Franky
爱范儿
爱范儿
Forbes - Security
Forbes - Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V2EX - 技术
V2EX - 技术
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
News and Events Feed by Topic
N
News | PayPal Newsroom
Schneier on Security
Schneier on Security
Cloudbric
Cloudbric
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Recent Commits to openclaw:main
Recent Commits to openclaw:main
人人都是产品经理
人人都是产品经理
P
Privacy International News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
阮一峰的网络日志
阮一峰的网络日志
D
DataBreaches.Net
Last Week in AI
Last Week in AI
罗磊的独立博客
Spread Privacy
Spread Privacy
Recent Announcements
Recent Announcements
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
The Register - Security
The Register - Security
Y
Y Combinator Blog
J
Java Code Geeks
I
Intezer

博客园 - searchDM

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