1.软件版本介绍
SOLR版本:6.6.2
Luccence:6.6.2
jdk版本:1.8.0.x系列
Zookeeper:3.4.6
Tomcat:8.5.x系列
2. 下载的插件
链接:https://pan.baidu.com/s/1kt9QTTAmQjdPdrojlodGdQ 密码:b29y
3.配置managed-schema字段类型及参数详解
<!--元数字字段--> <field name="questionpinyin" type="text_smartcn" indexed="true" stored="true" multiValued="false" /> <!--字段类型--> <fieldType name="text_smartcn" class="solr.TextField" positionIncrementGap="0"> <analyzer type="index"> <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/> <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" /> <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" /> <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true" maxPosAsterisk="2" maxPosQuestion="1" minTrailing="2" maxFractionAsterisk="0"/> </analyzer> <analyzer type="query"> <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/> <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" /> <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" /> </analyzer> </fieldType>
withOriginal:如果为true,那么在相同的位置产生原始的和反向的词元,如果为false,则只产生反向词元
maxPosAsterisk:指的是“*”最大在第几位会被翻转,默认是2,比如当前值等于2的时候,搜索*明星和 女*明星 都会被翻转,建议默认值就行。
maxPosQuestion:指的是?号最大在第几位查询此会被翻转,默认为1。设置为0,1和maxposasterisk扭转单纯的后缀查询
minTrailing:触发反转的附加参数,如果星号(“*”)的位置是低于这个分数查询标记长度。默认值为0.0f(禁用)
maxFractionAsterisk:最低数量的字符通配符查询令牌过去后。为了好的性能,这应该设置为大于1的值。默认为2
minTermLenght:最小中文词长度,意思是小于这个值的中文词不会做拼音转换。
minGram:最小拼音切分长度。
4. solr之admin演示分析效果,参考如下图:
5.核心代码分析
ModifiableSolrParams params = new ModifiableSolrParams() ; //验证是否包含有拼音 if(StringUtils.isNotBlank(engKey) && StringUtils.isNotBlank(pinYinWords)){ String qTemp = "questionPinyin:*%s*"; qTemp = String.format(qTemp, words); params.set("q", qTemp); buffer.append(" AND ").append(QuestionTitle.QUESTION_TYPE.getText()+":SpecialtyAndStandard"); buffer.append(" AND ").append(QuestionTitle.ROBOTANSWERSTATUS.getText()+":1"); buffer.append(" AND ").append(QuestionTitle.AUDIT_STATUS.getText()+":1"); params.set("fq",buffer.toString()); //此处省略 QueryResponse rsp = cloudSolrServer.query(params); ///............................. }
时间问题,此文章只是简单的描述实现思路,仅供参考,不足之处还望见谅~
待后续有时间再补充细节~