solr5使用suggest模块实现搜索联想
来源:互联网 发布:网络代理店 编辑:程序博客网 时间:2024/06/07 12:18
一、概述
Solr从1.4开始便提供了检查建议,检索建议目前是各大搜索的标配应用,主要作用是避免用户输入错误的搜索词,同时将用户引导到相应的关键词搜索上。通常,我们将其称为搜索联想。其效果如图所示。在Solr中,实现该功能的模块叫做suggest。
二、solr配置
1.添加联想类型
首先需要加上用以联想的字段,这里假设我们对name字段进行联想,配置如下(managed-schema文件):
<field name="name" type="text_ik" multiValued="false" indexed="true" stored="true"/><field name="name" type="text_ik" multiValued="false" indexed="true" stored="true"/><copyField source="name" dest="suggestion"/><fieldType name="text_ik" class="solr.TextField"> <analyzer isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/></fieldType>
在本例中,suggestion字段即为suggest联想所取的字段。这里将suggestion字段设为text_suggest类型,text_suggest是一个自定义的类型,具体作用和配置后面再说。然后利用copyField将name字段拷贝到suggestion字段。那么为什么我们不直接对name字段进行联想,而是专门建立一个字段把name字段拷贝过去,乃至专门建立了一个字段类型呢?在配置中我们可以看到,name字段采用了IKAnalyzer进行了中文分词,如果我们直接对name字段进行分词,则联想出来的就会是分词之后的结果。例如期望联想的记录是“先吃水果然后吃雪糕”,最后联想出来的却是“先吃”,如图所示。
2.配置联想字段
接下来就需要建立一个专门的字段类型来配合suggest模块进行检察建议了。这里该字段名称为text_suggest,配置如下(managed-schema文件):
<fieldType name="text_suggest" class="solr.TextField"> <analyzer type="index"> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>在这里我们要对整个字段进行联想,因此采用KeywordTokenizerFactory作为分词器,并且使用LowerCaseFilterFactory来保证其可以不区分大小写。可以根据需要替换成自己需要的analyzer。
3.suggest模块配置
现在我们的记录表结构已经建立好了,下面我们进行suggest模块的配置。
首先我们来添加suggest模块。编辑solrconfig.xml文件,添加如下配置:
<searchComponent name="suggest" class="solr.SuggestComponent"> <lst name="suggester"> <str name="name">suggest</str> <str name="lookupImpl">AnalyzingLookupFactory</str> <str name="dictionaryImpl">DocumentDictionaryFactory</str> <str name="field">suggestion</str> <str name="suggestAnalyzerFieldType">text_suggest</str> <str name="buildOnStartup">false</str> </lst> </searchComponent>在本配置中,name为该suggest模块的名字;lookUpImpl为查找器,默认为JaspellLookupFactory;dictionaryImpl为字典实现;field为要联想的字段;suggestAnalyzerFieldType规定了进行联想操作所使用类型所对应的Analyzer(该字段必填);buildOnStartup表示是否在启动时建立索引。
具体配置信息详见https://cwiki.apache.org/confluence/display/solr/Suggester。
4.requestHandler配置
接下来我们需要配置suggest模块的requestHandler。编辑solrconfig.xml文件,添加如下配置:
<requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler"> <lst name="defaults"> <str name="suggest">true</str> <str name="suggest.dictionary">suggest</str> <str name="suggest.count">10</str> </lst> <arr name="components"> <str>suggest</str> </arr> </requestHandler>下面解释配置中涉及到的参数。suggest参数不用说了,必须为true;suggest.dictionary为suggest操作所需要用到的字典,应当与上面suggest模块配置中的name属性保持一致;suggest.count为候选词数量,这里为10。具体配置可在上面suggest模块配置的链接中找到。
5.建立索引
这里我们就已经把suggest模块配置完毕了。如果suggest模块配置中buildOnStartup设置为false,则需要手动建立一次索引。建立索引链接形如:
http://localhost:8993/solr/test/suggest?suggest=true&suggest.dictionary=suggest&wt=json&suggest.q=Ath&suggest.build=true
6.效果预览
三、接入solrj
从solrj的5.3.1版本开始,加入了SuggesterResponse类用来接收suggester的信息。该类的API文档见https://lucene.apache.org/solr/5_3_1/solr-solrj/org/apache/solr/client/solrj/response/SuggesterResponse.html。
下面给出SuggesterResponse的用法:
package org.fhp.solrtest;import java.io.IOException;import java.util.List;import java.util.Map;import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.SolrServer;import org.apache.solr.client.solrj.SolrServerException;import org.apache.solr.client.solrj.impl.HttpSolrServer;import org.apache.solr.client.solrj.response.QueryResponse;import org.apache.solr.client.solrj.response.SuggesterResponse;import org.junit.Test;public class SpellCheckTest {@Testpublic void testSpellCheck() throws SolrServerException, IOException {HttpSolrServer server = new HttpSolrServer("http://localhost:18990/solr/test");SolrQuery params = new SolrQuery(); params.set("qt", "/suggest"); params.setQuery("我们"); QueryResponse response = null; response = server.query(params); SuggesterResponse suggest = response.getSuggesterResponse(); Map<String, List<String>> termMap = suggest.getSuggestedTerms(); for (List<String> strs : termMap.values()) { for(String s : strs) { System.out.println(s); } } }}
0 0
- solr5使用suggest模块实现搜索联想
- 联想词搜索(suggest)
- js实现联想搜索
- Solr Suggest实现搜索智能提示
- Solr Suggest实现搜索智能提示
- Solr Suggest实现搜索智能提示
- Ajax实现Google Suggest风格搜索
- Ajax-实现Google Suggest风格搜索
- Solr Suggest实现搜索智能提示
- 使用Ajax模仿Google suggest的搜索提示(Java+JSP+JS实现)
- elasticsearch 实现联想输入搜索
- solr 搜索建议suggest
- 一步一步跟我学习lucene(10)---lucene搜索之联想词提示之suggest原理和应用
- bootstrap-suggest-plugin (bsSuggest) 联想搜索插件之——中文字符在IE下POST 时乱码现象解决方案
- 使用Trie字典树来实现搜索框检索词联想功能
- 联想搜索
- 联想搜索
- 联想搜索
- AngularJS的四大核心特性(二)
- batch normalization 正向传播与反向传播
- Html页面内引入抽取出来的Html,js,css示例
- OpenSSH的安装和使用
- JavaScript的学习路线
- solr5使用suggest模块实现搜索联想
- java模拟http请求调用远程接口工具类
- bzoj1562 [NOI2009]变换序列
- RBM的学习算法
- mysql乱码问题
- JAVA和C++区别
- php 将某个数组里的字符串二次拆分后的某个值再次拼接成字符串
- 微商达人7.0不封号微信一键转发全球定位自动加人爆粉软件,微商达人7.0定制版下载安装使用教程
- lambda 表达式解析