一 需求
本文运行环境:Solr6 + 内置服务器Jetty
在企业中建议使用Tomcat作为服务器来运行Solr,注意:整合这里不作强调,不过有个小点要注意,如果在solr页面查不到数据可能是因为Tomcat无法解析 / 的原因,需要在Tomcat的conf/catalina.properties 最后一行加上org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true。
二 Solr配置
1 添加联想类型
ItemTitle为需要联想字段,配置如下(managed-schema文件):
<field name="ItemTitle" type="text_general" indexed="true" stored="true"/>
<field name="CountryCode" type="text_general" indexed="true" stored="true"/>
<field name="Weight" type="string" indexed="false" stored="true"/>
<field name="DESC" type="string" indexed="false" stored="true"/>
<!-- 采用suggust模块实现联想搜索 -->
<field name="suggestion" type="text_suggest" indexed="true" stored="true" multiValued="true"/>
<copyField source="ItemTitle" dest="suggestion"/>
suggestion字段即为suggest联想所取的字段。这里将suggestion字段设为text_suggest类型,text_suggest是一个自定义的类型,具体作用和配置详见后文。然后利用copyField将ItemTitle字段拷贝到suggestion字段。
2 配置联想字段
接下来就需要建立一个专门的字段类型来配合suggest模块进行检察建议了。这里该字段名称为text_suggest,配置如下(managed-schema文件):
<!-- text_suggest 类型定义-->
<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模块的配置,配置如下(solrconfig.xml文件):
<!-- suggest模块配置 -->
<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="payloadField">DESC</str>
<str name="field">ItemTitle</str>
<str name="suggestAnalyzerFieldType">text_suggest</str>
<!--数据结构建立,建立手动开启 http://localhost:8983/solr/merge/suggest?suggest=true&suggest.dictionary=suggest&wt=json&suggest.q=Ath&suggest.build=true -->
<str name="buildOnStartup">true</str>
<str name="buildOnCommit">true</str> <!-- 这两个参数看下文 -->
<str name="buildOnOptimize">true</str>
</lst>
</searchComponent>
在本配置中,name为该suggest模块的名字;lookUpImpl为查找器,默认为JaspellLookupFactory;dictionaryImpl为字典实现;field为要联想的字段;suggestAnalyzerFieldType规定了进行联想操作所使用类型所对应的Analyzer(该字段必填);buildOnStartup表示是否在启动时建立索引,建议设置为false。
ps:参数的补充::
4 requestHandler配置
接下来配置suggest模块的requestHandler。配置如下(managed-schema文件):
<!-- suggest的requestHandler配置 -->
<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。
5 建立索引
这里我们就已经把suggest模块配置完毕了。如果suggest模块配置中buildOnStartup设置为false,则需要手动建立一次索引。建立索引链接如下:
http://localhost:8983/solr/merge/suggest?suggest=true&suggest.dictionary=suggest&wt=json&suggest.q=Ath&suggest.build=true
三 效果预览
详细请参见相关文档Solr的suggest组件使用大全:
https://www.w3cschool.cn/solr_doc/solr_doc-7yp92gzc.html