`
hankesi2000
  • 浏览: 97299 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Solr的自动完成/自动补充实现介绍(第二部分)

 
阅读更多
原文链接:Solr and Autocomplete (part 2)

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:绑定这个搜索的对象,目前有两个类可以使用-JasperLookupTSTLookup,第二个效率更高
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>


结尾
下一部分我将介绍如何修改配置来使用静态的词典信息以及怎么获得更好的建议。该系列的最后一部分将对会这些方法做一个性能的比较,并选出在不同场景下最快的一个。
  • 大小: 10.3 KB
3
1
分享到:
评论
3 楼 hankesi2000 2011-10-24  
mohenglyf 写道
你好,请问使用suggest的方式,可以在q中输入空格么,我尝试了貌似不行,suggest机制会把空格当做一个分隔符,比如“百度 百科”这个词,suggest会返回“百度”和“百科”两个词的suggest结果,而不是合并起来的suggest结果。楼主有没有什么解决方案呢?

http://java.dzone.com/news/solr-and-autocomplete-part-3?mz=33057-solr_lucene 该系列文章的第三部分,使用自定义字典的方式,可以达到你要的效果。如果想用第2种方法的话,建议你看下它的源码吧
2 楼 hankesi2000 2011-10-24  
mohenglyf 写道
你好,请问使用suggest的方式,可以在q中输入空格么,我尝试了貌似不行,suggest机制会把空格当做一个分隔符,比如“百度 百科”这个词,suggest会返回“百度”和“百科”两个词的suggest结果,而不是合并起来的suggest结果。楼主有没有什么解决方案呢?

我试 了一下,确实有这个问题。这应该是这个组件本身的问题吧,比如拼写检查、中文分词等因素,呵呵,没仔细研究过。自动完成功能,我们自己目前还没有使用场景,所以没具体研究。。。
1 楼 mohenglyf 2011-10-21  
你好,请问使用suggest的方式,可以在q中输入空格么,我尝试了貌似不行,suggest机制会把空格当做一个分隔符,比如“百度 百科”这个词,suggest会返回“百度”和“百科”两个词的suggest结果,而不是合并起来的suggest结果。楼主有没有什么解决方案呢?

相关推荐

    Java微服务架构l零从基础到精通高清视频教程全套 163课

    第2章 Linux使用 005Linux 简介 006Linux 与 Windows 比较 007安装 Linux 008Linux 远程控制管理 009Linux 目录结构 010操作文件目录 011系统管理命令 012开关机命令 013压缩命令 014Linux 编辑器 015修改数据源 ...

    Java微服务架构163课

    第2章 Linux使用 005Linux 简介 006Linux 与 Windows 比较 007安装 Linux 008Linux 远程控制管理 009Linux 目录结构 010操作文件目录 011系统管理命令 012开关机命令 013压缩命令 014Linux 编辑器 015...

    黑马面试宝典知识点复习

    主要实现类有HashMap(基于哈希表实现)、TreeMap(基于红黑树实现,键值自动排序)等。 #### IO - **输入输出流**:Java中处理文件读写的基础API。主要包括InputStream/OutputStream(字节流)和Reader/Writer...

    java开源包3

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包4

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包2

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包1

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包11

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包6

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包5

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包10

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包8

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包7

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包9

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包101

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    Java资源包01

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

Global site tag (gtag.js) - Google Analytics