转载:Solr的自动完成实现方式(第二部分:Suggester方式)

转自:http://www.cnblogs.com/ibook360/archive/2011/11/30/2269077.html

在Solr的自动完成/自动补充实现介绍(第一部分) 中我介绍了怎么用faceting的机制来实现自动完成(autocomplete)的功能,今天我们来看一下如何用Suggester的组件来实现自动完成功能.

开始 

这里有一点需要提醒:Suggest组件在1.4.1或以下版本不可用。要使用这个组件,你需要下载3_x或lucene/solr的主干版本。

配置 
在索引配置之前,我们定义一个searchComponent:

<searchComponent name="suggest" class="solr.SpellCheckComponent">    <lst name="spellchecker">      <str name="name">suggest</str>      <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>      <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>      <str name="field">name_autocomplete</str>    </lst>  </searchComponent>  

这个组件是基于solr.SpellCheckComponent的,这样我们就可以使用它的一些配置。配置中有3个非常重要的属性:

name:组件名 
lookupImpl:绑定这个搜索的对象,目前有两个类可以使用-JasperLookup、TSTLookup,第二个效率更高 
field:针对的字段

现在让我们添加合适的handler:

<requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler">    <lst name="defaults">      <str name="spellcheck">true</str>      <str name="spellcheck.dictionary">suggest</str>      <str name="spellcheck.count">10</str>    </lst>    <arr name="components">      <str>suggest</str>    </arr>  </requestHandler>  

非常简单的配置,它定义了Search的组件,告诉solr每次建议的最大个数为10,使用上面定义的suggest组件。

索引 
假设我们的文档有三个字段:id、name、description。我们想给name字段做自动完成功能,索引配置则为:

<field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>  <field name="name" type="text" indexed="true" stored="true" multiValued="false" />  <field name="name_autocomplete" type="text_auto" indexed="true" stored="true" multiValued="false" />  <field name="description" type="text" indexed="true" stored="true" multiValued="false" />  

另外,需要定义一个copyFiled:

<copyField source="name" dest="name_autocomplete" />  

单词建议 
为了完成单独词的建议,我们需要定义一个 text_autocomplete的类型:

<fieldType class="solr.TextField" name="text_auto" positionIncrementGap="100">    <analyzer>      <tokenizer class="solr.WhitespaceTokenizerFactory"/>      <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>      <filter class="solr.LowerCaseFilterFactory"/>     </analyzer>  </fieldType>  

词组建议 
如果实现完整的词组建议,我们的text_autocomplete类型应该定义为:

<fieldType class="solr.TextField" name="text_auto">    <analyzer>      <tokenizer class="solr.KeywordTokenizerFactory"/>      <filter class="solr.LowerCaseFilterFactory"/>    </analyzer>  </fieldType>  

如果使用词组,你需要定义自己的转换类(对于中文如庖丁、iK等)

建立词典 
在我们开始使用该组件前,我们需要对它建立索引,可以使用solr命令:

/suggest?spellcheck.build=true  

查询 
现在终于可以使用这个组件了。使用词组的建议方式,假设查询语句为:

/suggest?q=har  

执行该语句后,得到下面的建议:

<?xml version="1.0" encoding="UTF-8"?>  <response>    <lst name="responseHeader">      <int name="status">0</int>      <int name="QTime">0</int>    </lst>    <lst name="spellcheck">      <lst name="suggestions">        <lst name="dys">          <int name="numFound">4</int>          <int name="startOffset">0</int>          <int name="endOffset">3</int>          <arr name="suggestion">             <str>hard drive</str>             <str>hard drive samsung</str>             <str>hard drive seagate</str>             <str>hard drive toshiba</str>          </arr>        </lst>      </lst>    </lst>  </response>  

时间: 2024-07-31 14:06:22

转载:Solr的自动完成实现方式(第二部分:Suggester方式)的相关文章

【自动语音识别课程】第二课 语音信号分析

[传送门] [自动语音识别课程]第一课 统计语音识别介绍 原文地址:http://blog.csdn.net/joey_su/article/details/36414877 转载请注明出处,欢迎交流. 概述 针对ASR的语音信号分析 特征 频谱分析 倒谱分析 标准特征:MFCC和PLP分析 动态特征 第一课的结尾提到了语音识别的框图,下图展示了信号分析技术在语音识别系统中的位置: 我们先来认识下语音的产生过程: 语音是在发音器官和声道共同作用下产生的.说话时,声带振动发出具有一定周期特性(基音

转载:eclipse 搭建SSH项目(第二篇,有具体的项目例子)

原文地址:http://blog.csdn.net/yeohcooller/article/details/9316923 读博文前应该注意: 本文提纲:本文通过一个用户注册的实例讲解SSH的整合.创建Struts项目,整合Hibernate,整合Spring.最后总结如何熟练创建SSH项目. 仅是创建SSH项目,对于其他的扩展例如Struts的国际化,Hibernate的缓存优化,Spring的AOP等,本博文涉及不到.想学习更多的东西请搜索其他博文. 本项目的环境:Windows 8-64位

(转载)solr实现满足指定距离范围条件的搜索

配置schema.xml <?xml version="1.0" encoding="UTF-8" ?> <schema name="aifang-loupan" version="1.1"> <types> <fieldType name="string" class="solr.StrField" sortMissingLast="

用POI导出excel时,较长的数字不想被自动变为科学计数法的解决方式(转)

做过很多次导出excel了.都碰到一个问题,内容里如果包含一个比较长的数字,比如订单号“2546541656596”,excel会自动变成科学计数法... 弄过好几次都没有解决,最近又要导出excel了,下决心一定要找到解决办法 自己在excel里测试过,较长的数字,都会自动变成科学计数法,除非我们把单元格格式设置成“文本型” 哈哈,似乎找到了思路:用poi先把单元格设置成“文本型”就可以了把. 从文档里找到了这个方法HSSFCell.setCellType(int type),怎么看这个方法都

【转载】myeclipse自动生成注释

在使用Eclipse编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的,例如其中author 的属性值. 我们可以在Eclipse中进行设置自己希望显示的信息. 现在看看如何修改我们的用户名即作者信息:点击Windows->Preferences->Java->Code Style->Code Templates, 然后我们就可以选择右边窗口中的Comments,对应具体的comments选项,我们便可以对具体的注释信息进行编辑设置. 例如我们希望在一个Java文

磁盘阵列3块有硬盘掉线使用第二种校验方式恢复数据

Raid6磁盘阵列可以看做是raid5阵列的升级版,在raid5的奇偶校验基础上又增加了一种校验,就空间使用率而言raid5磁盘阵列是N-1的空间使用率,raid6阵列是N-2的空间使用率.小编经常记录恢复raid5磁盘阵列的案例,今天介绍一个raid6阵列的数据恢复案例.这次数据恢复的硬件设备是某公司的一台web服务器,raid6磁盘阵列,一共有6块硬盘,现在已经有3块硬盘处于离线状态,服务器崩溃,服务器上的MySQL数据库数据丢失,业务停滞,客户想在北京联系数据恢复公司进行数据恢复,于是联系

python_并发编程——多进程的第二种启动方式

1.多进程的第二种启动方式 import os from multiprocessing import Process # 创建一个自定义类,继承Process类 class MyProcess(Process): # 必须实现一个run方法,run方法中是子进程中执行的代码 def run(self): print('子进程:',os.getpid()) if __name__ == '__main__': print('主进程',os.getpid()) p1 = MyProcess() p

git防止每次提交输入用户名与密码的方法(http方式 而不是 ssh方式)

windows下比较比较好用的git客户端有2种: 1. msysgit + TortoiseGit(乌龟git) 2. GitHub for Windows github的windows版也用过一段时间,但还是不太习惯.所以目前仍然青睐与msysgit+乌龟git的组合.TortoiseGit在提交时总数会提示你输入用户名密码,非常麻烦.解决方案如下: 方法一: 设置 -> git 编辑本地 .git/config 增加 1[credential] 2 helper = store保存,输入一

Hibernate的检索方式--查询数据的方式

Hibernate 提供了以下几种检索对象的方式1导航对象图检索方式: 根据已经加载的对象导航到其他对象(根据已经加载的对象,导航到其他对象-例如一对多的查询)2OID 检索方式: 按照对象的 OID 来检索对象(更具ID查询---find(Id).get(),load())3HQL 检索方式: 使用面向对象的 HQL 查询语言4QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接