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

本文介绍如何使用Solr的Suggester组件实现自动完成功能,包括配置、索引及查询等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:[url="http://css.dzone.com/news/solr-and-autocomplete-part-2?mz=33057-solr_lucene"]Solr and Autocomplete (part 2)[/url]

在[url="http://hankesi2000.iteye.com/admin/blogs/1134395"]Solr的自动完成/自动补充实现介绍(第一部分) [/url]中我介绍了怎么用faceting的机制来实现自动完成(autocomplete)的功能,今天我们来看一下如何用Suggester的组件来实现自动完成功能.

[size=large][b]开始[/b][/size]
[img]http://dl.iteye.com/upload/attachment/553742/80f1fc90-e39d-364b-87b8-029dcd0d71ce.png[/img]

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

[size=large][b]配置[/b][/size]
在索引配置之前,我们定义一个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>


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

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

现在让我们添加合适的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组件。

[size=large][b]索引[/b][/size]
假设我们的文档有三个字段:[color=gray]id、name、description[/color]。我们想给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" />


[size=large][b]单词建议[/b][/size]
为了完成单独词的建议,我们需要定义一个 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>


[size=large][b]词组建议[/b][/size]
如果实现完整的词组建议,我们的text_autocomplete类型应该定义为:

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

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

[size=large][b]建立词典[/b][/size]
在我们开始使用该组件前,我们需要对它建立索引,可以使用solr命令:
/suggest?spellcheck.build=true


[size=large][b]查询[/b][/size]
现在终于可以使用这个组件了。使用词组的建议方式,假设查询语句为:
/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>


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值