solr特点四: SpellCheck(拼写检查)
接下来,我将介绍如何向应用程序添加 “您是不是要找……”(拼写检查)。
提供拼写建议
Lucene 和 Solr 很久以前就开始提供拼写检查功能了,但直到添加了 SearchComponent架构之后,这些功能才可以无缝使用。现在您可以输入一个查询,让它不仅返回查询结果,并且为查询词语提供拼写建议(如果存在的话)。然后可以利用这些建议像 Google 那样显示 “您是不是要找……”,或者像 Yahoo! 那样显示 “请尝试……”。
集成拼写检查的妙处在于它能够(而且必须)根据索引中的标记给出建议。也就是说,它不必根据词典给出正确拼写的词语,而是根据与查询词语相似的拼写给出拼写建议(包括错误拼写)。例如,假设很多很多的人都将单词 hockey错误拼写成 hockei。查询 hockey的用户很可能是想查找里面带有单词 hockei的文档,因为它们是相关的(尽管是这些文档的作者不会拼写)。
SpellCheckComponent与 MLT 不同,它不需要在 solrconfig.xml 和 schema.xml 文件中进行配置。首先,模式必须先声明一个 Field和一个相关联的、其内容能够发挥拼写词典的作用的 FieldType。按常规,该 FieldType的分析过程要保持简单,而且不要派生词语或修改其他标志。我的样例 FieldType声明了它的 <analyzer>,如清单 11 所示:
清单 11. 声明一个 <analyzer>
<fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100" >
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
该 <analyzer>负责基本的标志化(尤其是拆分空格),然后将标志变成小写并移除复制。不用派生词语,也不用扩展同义词。就是这么简单。接下来我在 schema.xml 文件中声明了一个 field,名为 spell,它使用 textSpell <fieldType>。接着,我声明了 <searchComponent>,将 solrconfig.xml 文件中的必要的部分连接起来,如清单 12 所示:
清单 12. 声明 <searchComponent>
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">textSpell</str>
<lst name="spellchecker">
<str name="name">default</str>
<str name="field">spell</str>
<str name="spellcheckIndexDir">./spellcheckerDefault</str>
</lst>
</searchComponent>
在这个例子中,我将前面声明的 textSpell <fieldType>和 queryAnalyzerFieldType关联起来。(注意,我使用前面讲述的 last-components技术将组件到 Dismax 和 solrconfig.xml 中的标准 SolrRequestHandler声明)。这能够确保正确分析输入查询,从而与拼写索引进行比较。其余的配置选项指定拼写检查器的名称、包含构建拼写索引所用的内容的 Field,以及索引在磁盘上的储存位置。
完成全部配置之后,您必须构建拼写索引。这可以通过用 HTTP 向组件发送请求来完成,比如:
http://localhost:8983/solr/rss/select/?q=foo&spellcheck=true&spellcheck.build=true
拼写检查构建工作流程
要查询拼写检查索引,必须先构建它。初始构建完成后,您需要确定(通过您的应用程序)重新构建索引的频率。您也可以在用 solrconfig.xml 中的 postCommit事件监听器完成提交之后再重新构建它。重构建的频率一定要以索引的更改数量为基准,但这一点并不是很重要,因为初始索引创建之后,很大地改动词典的可能性不大。
构建了索引之后,像往常一样查询并添加 spellcheck=true参数就会返回建议了。例如,清单 13 打开了拼写检查特性:
清单 13. 显示拼写检查的查询
http://localhost:8983/solr/rss/select/?q=holr&spellcheck=true
运行清单 13 中的查询会返回零个结果,但是它会提供以下建议:
<lst name="spellcheck">
<lst name="suggestions">
<lst name="holr">
<int name="numFound">1</int>
<int name="startOffset">0</int> <int name="endOffset">4</int>
<arr name="suggestion">
<str>solr</str>
</arr>
</lst>
</lst>
</lst>
再深入一步,多个词语的查询也可以使用拼写检查。组件甚至能够自动地创建一个推荐的新查询,该查询将所有词语的最佳建议结合起来。这可以通过添加 spellcheck.collate=true参数来实现。就像在错误拼写查询中一样,
http://localhost:8983/solr/rss/select/?q=holr+foo&spellcheck=true&indent=on
&spellcheck.collate=true
它生成了作为建议的一部分的结果 <str name="collation">solr for</str>。但是要注意,这个合并的结果可能不会返回结果,这取决于您是否用 AND将查询词语连接起来。
另外,拼写检查器还能采用与返回的建议数量和结果质量有关的查询参数。要想更多地了解 SpellCheckComponent的详细信息,请参见 参考资料中的 Solr wiki 页面链接。
solr特点四: SpellCheck(拼写检查)的更多相关文章
- Solr.NET快速入门(四)【相似查询,拼写检查】
相似查询 此功能会返回原始查询结果中返回的每个文档的类似文档列表. 参数通过QueryOptions的MoreLikeThis属性定义. 示例:搜索"apache",为结果中的每个 ...
- solr入门之solr的拼写检查功能的应用级别尝试
今天主要是收集了些拼写检查方面的资料和 尝试使用一下拼写检查的功能--=遇到了不少问题 拼写检查的四种配置眼下我仅仅算是成功了半个吧 --------------------------------- ...
- Solr4.3之拼写检查Spellcheck功能
原文地址:http://www.656463.com/article/iaquii.htm 拼写检查功能,能在搜索时提供一个较好用户体验,所以,主流的搜索引擎都有这个功能,在这之前,笔者先简单的说一下 ...
- solr拼写检查配置
拼写检查功能,能在搜索时,提供一个较好用户体验,所以,主流的搜索引擎都有这个功能. 那么什么是拼写检查,其实很好理解,就是你输入的搜索词,可能是你输错了,也有可能在它的检索库里面根本不存在这个词,但是 ...
- WPF 4 单词拼写检查(SpellCheck)
原文:WPF 4 单词拼写检查(SpellCheck) 在WPF中 Textbox 和RichTextBox 控件都内置了拼写检查属性,但该属性目前默认仅支持English.Spanish. ...
- solr拼写检查代码逻辑
自定义的solr搜索系统作为web应用发布到tomcat后,运行过程中其搜索代码逻辑如下: 用户solr搜索应用发送搜索请求URL,solr应用的org.apache.solr.servlet.Sol ...
- 1.7.7 Spell Checking -拼写检查
1. SpellCheck SpellCheck组件设计的目的是基于其他,相似,terms来提供内联查询建议.这些建议的依据可以是solr字段中的terms,外部可以创建文本文件, 或者其实lucen ...
- lucene拼写检查模块
Lucene是Apache发布的开源搜索引擎开发工具包,不仅提供了核心的搜索功能,还提供了许多其他功能插件,例如:拼写检查功能模块. 搜索拼写检查模块实现类在lucene-suggest-x.xx.x ...
- python 拼写检查代码(怎样写一个拼写检查器)
原文:http://norvig.com/spell-correct.html 翻译:http://blog.youxu.info/spell-correct.html 怎样写一个拼写检查器 Pete ...
随机推荐
- TCL数组
数组是一组使用索引对应元素的排列方式.常规数组的语法如下所示. set ArrayName(Index) value 用于创建简单数组的例子,如下所示. #!/usr/bin/tclsh set la ...
- 详解Oracle的几种分页查询语句
转载自:http://database.51cto.com/art/200904/118737.htm 分页查询格式: SELECT * FROM (SELECT A.*, ROWNUM RN FRO ...
- ease,seae-in,ease-in-out,ease-out区别
值 描述 linear 规定以相同速度开始至结束的过渡效果(等于 cubic-bezier(0,0,1,1)).(匀速) ease 规定慢速开始,然后变快,然后慢速结束的过渡效果(cubic-bezi ...
- 我的solr学习笔记--solr admin 页面 检索调试
前言 Solr/Lucene是一个全文检索引擎,全文引擎和SQL引擎所不同的是强调部分相关度高的内容返回,而不是所有内容返回,所以部分内容包含在索引库中却无法命中是正常现象. 多数情况下我们 ...
- 【CentOS 6.5】 Qt Creator 启动失败
在CentOS 6.5中 点击 [应用程序]->[编程]->Qt Creator , 没有反应,Creator没有启动,转而进入Shell cd /opt/Qt5.2.1/Tools/Qt ...
- 「小程序JAVA实战」小程序的个人信息作品,收藏,关注(66)
转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudegerenxinxizuopinshoucangguanzhu65 ...
- 什么是Emit,什么是反射,二者区别到底是什么?(转)
Emit的准确定义,我们看看微软给出的答案 System.Reflection.Emit 命名空间包含{ 允许编译器或工具发出元数据和发出 Microsoft 中间语言 (MSIL) ,并可选择在磁盘 ...
- servlet访问路径的写法
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...
- linux主机名
[linux主机名] 1.查看主机名 主机名即是一台主机的名字,在终端窗口中输入命令:hostname或uname –n,均可以查看到当前主机的主机名. 2.临时修改主机名 命令行下运行命令:“hos ...
- oracle数据库在sys下直接修改用户密码
首先用sys登录上去, 在命令窗口或者是能执行输入sql语句的地方输入下面代码, 回车就好 alter user you_username(要修改的用户名) identified by you_pas ...