Solr6之suggest联想搜索


一 需求

     本文运行环境: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文件):

扫描二维码关注公众号,回复: 2257131 查看本文章

	<!-- 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">suggestion</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>  
        </lst>  
    </searchComponent> 
  

  在本配置中,name为该suggest模块的名字;lookUpImpl为查找器,默认为JaspellLookupFactorydictionaryImpl为字典实现;field为要联想的字段;suggestAnalyzerFieldType规定了进行联想操作所使用类型所对应的Analyzer(该字段必填);buildOnStartup表示是否在启动时建立索引,建议设置为false

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参数必须配置为truesuggest.dictionarysuggest操作所需要用到的字典,应当与上面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 


效果预览


详细请参见相关文档Solrsuggest组件使用大全

https://www.w3cschool.cn/solr_doc/solr_doc-7yp92gzc.html




猜你喜欢

转载自blog.csdn.net/weixin_42245930/article/details/80691787