做一个搜索自动建议功能
据说是比/select查询效率要高,根据solr8.8官方文档说明表示,此功能可以通过 Spell Checking拼写检查实现,也可以用专门的SuggestComponent实现,我用的是前者。
因为要用到spellcheck这个组件,在solrconfig.xml文件里配置
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">text_ik</str>
<lst name="spellchecker">
<str name="name">default</str>
<str name="field">SUGGEST</str>
<str name="classname">solr.DirectSolrSpellChecker</str>
<str name="distanceMeasure">internal</str>
<float name="accuracy">0.5</float>
<int name="maxEdits">2</int>
<int name="minPrefix">1</int>
<int name="maxInspections">5</int>
<int name="minQueryLength">4</int>
<float name="maxQueryFrequency">0.01</float>
<float name="thresholdTokenFrequency">.01</float>
</lst>
</searchComponent>
<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="spellcheck.dictionary">default</str>
<str name="spellcheck">on</str>
<str name="spellcheck.extendedResults">true</str>
<str name="spellcheck.count">10</str>
<str name="spellcheck.alternativeTermCount">5</str>
<str name="spellcheck.maxResultsForSuggest">5</str>
<str name="spellcheck.collate">true</str>
<str name="spellcheck.collateExtendedResults">true</str>
<str name="spellcheck.maxCollationTries">10</str>
<str name="spellcheck.maxCollations">5</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>
因为spellchek最终是被suggest引用的一个插件,所以这里默认配置也行,我只把filed换成了我要使用的索引字段。
接下来就是添加suggest组件,同样是在solrconfig.xml文件中
<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">SUGGEST</str>
</lst>
</searchComponent>
<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>
name字段默认suggest相当于给此组件起个名字,
lookupImpl字段是查找方式,solr提供了不同的查找方式,TSTLookup是一个简单的紧凑的基于三元树的查找方式。
*field 很关键,如果没有配置自定义字典的话,这个字段就相当于字典字段,filed对应的字段必须在索引库里有值,此功能才能够实现。
详细字段解释在官方文档https://solr.apache.org/guide/8_8/suggester.html
然后配置schema
//拼写提示
<fieldType class="solr.TextField" name="textSpell" 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>
//短语提示,我用到的是短语提示,注意短语提示需要两个字以上suggest才会去找到。
<fieldType class="solr.TextField" name="textSpell2">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
//想要多个字段都能被suggest检索到,就复制到一个filed里
//source是来源,dest是最终字段,这些字段最后会被拼接到一起。
<field name="SUGGEST" type="textSpell" indexed="true" stored="true" multiValued="true"/>
<copyField source="DOCTITLE" dest="SUGGEST" maxChars="300" />
<copyField source="DOCCONTENT" dest="SUGGEST" maxChars="300" />
<copyField source="DOCKEYWORDS" dest="SUGGEST" maxChars="300" />
1.配置完成需要重新dataimport,如果查不到数据的话,在清空数据之前把conf下的dataimport.properties删了才清空数据。
2.导入数据完成后执行http://localhost:8983/solr/core/suggest?spellcheck.build=true&spellcheck=on
3.然后就可以用了,执行http://localhost:8983/solr/irp-core/suggest?q=信息