转自: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>

结尾 
下一部分我将介绍如何修改配置来使用静态的词典信息以及怎么获得更好的建议。该系列的最后一部分将对会这些方法做一个性能的比较,并选出在不同场景下最快的一个。

原文链接:Solr and Autocomplete (part 2)

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

  1. Spring学习笔记之 Spring IOC容器(二) 之注入参数值,自动组件扫描方式,控制Bean实例化方式,使用注解方式

     本节主要内容:    1. 给MessageBean注入参数值    2. 测试Spring自动组件扫描方式    3. 如何控制ExampleBean实例化方式    4. 使用注解方式重构Jdb ...

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

    做过很多次导出excel了.都碰到一个问题,内容里如果包含一个比较长的数字,比如订单号“2546541656596”,excel会自动变成科学计数法... 弄过好几次都没有解决,最近又要导出excel ...

  3. 使用Typescript重构axios(十九)——请求取消功能:实现第二种使用方式

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

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

    1.多进程的第二种启动方式 import os from multiprocessing import Process # 创建一个自定义类,继承Process类 class MyProcess(Pr ...

  5. C++动态存储方式与静态存储方式

    如果从变量值存在的时间(即生存期)来分,可将程序中的变量分为:动态存储方式和静态存储方式.它们所占用的存储空间区域不同. C++存储空间区域 代码区:存放可执行程序的程序代码.静态存储区:存放静态变量 ...

  6. LoadRunner 脚本学习 -- 动态储存方式和静态储存方式

    我们在定义变量是,根据定义的位置不同,分为全局变量与局部变量.我出生在一个叫“舞阳”的小县城,在这个县城中也有人名“舞阳”,前一个作用于整个县城,后一个只作用于他个人.那么从变量值的存在生存期角度,又 ...

  7. 1.tomcat部署项目的几种方式和weblogic部署方式及一点通讯

      第一种部署方式: 直接使用myeclipse 找到server服务 添加要部署的项目Add Deployment ,然后选中某个项目,首选Exploded Archive(development ...

  8. Python小白学习之路(九)—【字符串格式化】【百分号方式】【format方式】

    写在前面: 最近的事情好像有很多.李咏的离去,让我觉得很突然,仿佛印象中就是主持节目的他,看着他和哈文的爱情,很是感动.离去,没有什么抱怨,只是遗憾. 总会感慨,时光的流逝. 好像真的很快,转眼间,我 ...

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

    Hibernate 提供了以下几种检索对象的方式1导航对象图检索方式: 根据已经加载的对象导航到其他对象(根据已经加载的对象,导航到其他对象-例如一对多的查询)2OID 检索方式: 按照对象的 OID ...

随机推荐

  1. iis网站发布相关问题

    最近在公司的服务器上发布了一个简单的web应用,整个做下来到上线用了将近2天时间,期间出现了各种问题,现在发出来供大家参考: 1.iis上发布后出现访问网站,出现“IIS服务器被配置为不列出此目录的内 ...

  2. SOCKET 服务器停止服务时清理连接操作

    刚想到一个情况,正好是工作中遇到的. 当服务器停止时,正好有连接的请求正在被处理,而此时服务端需要等待该请求被正常的处理完,然后给客户端发送响应报文. 正常情况下,服务器停止的时候,是希望发送了响应报 ...

  3. Python多线程互斥锁

    import threading import time num=0 def Mylock(lock): global num lock.acquire() num=num+1 time.sleep( ...

  4. unity中的WWW通讯问题

    网上很多写到WWW的问题. 一.局限性比较大,使用不方便二.WWW类的使用不符合微软的命名规范三.在大量并发使用WWW类会发生"Too Many Threads"的异常 确实有些, ...

  5. Coretext实现图文混排及Gif图片播放

    CoreText是iOS3.2推出的一套文字排版和渲染框架,可以实现图文混排,富文本显示等效果. CoreText中的几个重要的概念:  CTFont CTFontCollection CTFontD ...

  6. 使用PerfView诊断.Net GC的问题

    PerfView 概述: PerfView是一个可以帮助你分析CPU和内存问题的工具软件.它非常轻量级也不会入侵诊断的程序,在诊断过程中对诊断的程序影响甚微. Visual Studio自带的性能分析 ...

  7. http国际化模拟请求

    现在好多系统都有国际化的需求.不同国家的人读到不同的语言数据.那么怎么模拟请求的时候区分是哪个国家的语言信息,代码说明. HttpPost methed = new HttpPost("模拟 ...

  8. java.lang.NoClassDefFoundError: org/apache/ibatis/session/SqlSession

    在配置一个springmvc+mybatis的项目时,总是有报一个错误: org.springframework.beans.factory.BeanCreationException: Error ...

  9. jq 版的tab切换

    ta切换是在前端中非常常见的一种效果,网上的效果很多.但是我觉得下面这种方法最好,把tab效果封装成一个函数 tabs,这个函数要配合jq使用. var tabs = function (tab, c ...

  10. Hibernate单元测试工具junit

    相关注解 @Text :测试方法 @Before :初始化方法 @After : 释放资源