知识点
相关文章
更多最近更新
更多Apache Solr3.4应用实践(高亮 拼写检查 匹配相似)
2019-03-27 01:10|来源: 网路
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代码
<?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>
高亮内容与关键匹配的地方,默认将会被 "<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代码
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="name">default</str>
<!--这里指明需要根据哪个字段的索引为依据进行拼写检查。现配置 名为 name 的字段-->
<str name="field">name</str>
<!--拼写检查索引的目录-->
<str name="spellcheckIndexDir">spellchecker</str>
<!--当commit的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果)-->
<!--当然,也可以选择在optimize的时候,进行构建。那么只需要将"buildOnCommint"换为 "buildOnOptimize"-->
<str name="buildOnCommit">true</str>
</lst>
</searchComponent>
<requestHandler name="/spell" class="solr.SearchHandler" 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>
配置完之后,需要重新建遍索引才能失效。然后我们这以请求 http://localhost:8080/solr/spell?q=name:王麻字&spellcheck=true
查询如果如下:
Xml代码
<?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>
有时候我们需要以多个字段为依据进行拼写检查,但上面的配置只能设一个字段。为了达到同样的效果,我能只能另行其道了。需要用到 coptyField 技术。比如我们在 schema.xml 中定义了
Xml代码
<field name="a" .../>
<field name="b" .../>
想对字段 a 和 b 同时为依据进行拼写检查,我们可能再加一个 field
Xml代码
<field name="ab" multiValued="true" .../>
然后再加两个 copyField
Xml代码
<copyField source="a" dest="ab"/>
<copyField source="b" dest="ab"/>
完整的配置如下:
Xml代码
<field name="a" .../>
<field name="b" .../>
<field name="ab" multiValued="true" .../>
<copyField source="a" dest="ab"/>
<copyField source="b" dest="ab"/>
(更详细的内容可以参考 SpellCheckComponent)
匹配相似(moreLikeThis)
他的作用是查找相似的document。
首先在 solrconfig.xml 中配置 MoreLikeThisHandler
Xml代码
<requestHandler name="/mlt" class="solr.MoreLikeThisHandler">
</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代码
<field name="name" termVector="true" .../>
当然 mlt.fl 也可以添加多个field ,用逗号隔开就行了
(详细说明可参考 MoreLikeThis MoreLikeThisHandler)
转自:http://www.cnblogs.com/ibook360/archive/2011/11/21/2257200
相关问答
更多-
每个文件的Apache Solr核心(Apache Solr core per file)[2023-08-23]
您可能想要考虑的一些要点: - 如果你有完全不同的实体,没有任何共同点,也没有任何依赖(没有连接),最好将它们作为单独的核心。 这将是一个更清洁的方法。 因为可能存在具有共同名称的字段,并且需要以不同方式进行分析 搜索以不同的方式表现为字段及其提升 如果数据量很大,这也是可以管理的。 但是,如果您有一个非常小的数据集,而上述任何一个都没有,那么您只需使用单个核心。 您可以使用类型例如curreny_aud和holiday_aud为ID添加前缀的唯一键,这将帮助您保持实体分离并防止覆盖。 Some of th ... -
您似乎已经命名了搜索组件suggester ,并且您的requestHandler正确引用它,因此可能不是问题所在。 你能否在其余的solrconfig.xml中检查其他一些requestHandler是否在其last-components部分或其他地方引用了一个名为spellcheck的组件? 这会引发错误,因为它无法再找到具有该名称的组件(它已被重命名为suggester )。 solrconfig的问题是它附带了许多预先配置的搜索处理程序,如果你更改一个项目的默认名称,它可能会导致引用它的处理程序出现 ...
-
事实证明, 使用内置的拼写检查程序无法解决问题 。 幸运的是,Solr是开源的,每个人都可以修改其代码来实现这一目标。 As it turned out the problem could not be solved with built-in spellchecker. Fortunately, the Solr is opensource and everyone can modify its code to accomplish this goal.
-
我认为您在请求中缺少df (默认字段)参数。 在你的请求中添加df=name : HTTP://本地主机:8983 / solr的/ mycore /索引拼写缩进= ON&spellcheck.q = tanaz&重量= JSON&spellcheck.collate =真DF =名字? 您也可以在您的请求处理程序默认值中对此进行配置,因此您无需在请求中发送此请求。
当我使用solr拼写检查组件时,建议结果顺序如何?(How is the suggestion result order when I use the solr spellcheck component?)[2022-01-23]
默认情况下,距离和人气。 它计算Levenshtein距离 ,然后首先对其进行排序,然后根据每个可能的替换在索引中出现的频率在每个组内进行排序。 deutsch - 距离:1 荷兰 - 距离:1 德意志 - 距离:2 durch - 距离:2 死亡 - 距离:2 据推测,“德意志”似乎比“荷兰人”更常出现,而“德意志”更常出现在“溺水”或“死亡”之上。 By default, distance and popularity. It calculates the Levenshtein distance, a ...Solr本身并不支持这一点。 这是你可以在客户端处理的东西。 Solr itself doesn't support this. It is something you can handle in the client.答案是一起指定spellcheck.q和q 。 这样主要的查询结果基于q但拼写建议在spellcheck.q 。 看起来Solr正在对q进行标记并应用一些过滤器。 The answer is to specify spellcheck.q and q together. That way the main query results are based on q but the spelling suggestion on spellcheck.q. It looks like Solr was token ...如何将Apache Solr Search与Drupal 7站点集成?(How can I integrate the Apache Solr Search with my Drupal 7 Site?)[2022-11-18]
有两个支持Solr with Drupal的模块被广泛使用: 搜索API Solr ApacheSolr搜索 两者都有各种配置'怪癖',我想你需要尝试两者来看看它们如何适合你的网站,看看哪个最适合你。 确保服务器上已安装Java 5或更高版本。 使用Search API for Solr设置站点的教程 使用ApacheSolr设置站点的教程 There are two modules that support Solr with Drupal that are widely used: Search API ...Solr拼写检查配置(Solr spellcheck configuration)[2023-07-21]
将所有文本字段复制到一个字段:然后从字段“textSpell”构建拼写检查索引 default textSpell ./spellchecker 我有一个非常类似的问题,我无法解决。 有人在我的问题上发布了一个可以帮助你的详细答案: solr建议者没有返回任何结果 I ended up resolving this issue a while ago, but to my recollection, the issue was that I was using multipledirectives to copy data to the "spell" field, but I did not set multiValue ...