拼音检索中国人的专用检索,例如:中文内容为“中国”的输入 “zhongguo”、“zg”、“zhonggu 全拼”、“简拼”、“拼音”的相邻的一部分都应该能检索出“中国”来。
想要实现拼音检索第一个就是拼音转换,我这里用的是pinyin4j进行拼音转换。第二个就是N-Gram的题目,推敲到用户可能输入的既不是前缀也不是后缀,所以此处选择的是N-Gram,Solr里的实现叫 EdgeNGramTokenFilter,但是分的太细了,不需要这么复杂 EdgeNGramTokenFilter,也就是说我们用的N-Gram不同于传统的N-Gram。
同样的例子使用EdgeNGramTokenFilter从前往后取2-Gram的结果是zh,一般是取min - max 之间的所有 gram,所以使用EdgeNGramTokenFilter取2-20的gram结果就是zh,zho,zhon,zhong,zhongg,zhonggu,zhongguo,从这个例子也不难理解为什么我要选择使用EdgeNGramTokenFilter而非一般意义上的N-Gram,考虑到用户可能输入的不是前缀而是后缀,所以为了照顾这些用户,我选择了从前往后和从后往前使用了两次 EdgeNGramTokenFilter,这样不只是前缀、后缀,二十任意的字串都考虑进去了,所以大幅度的提高了搜索体验。
现在思路明确了我们把它结合到Solr中,为了方便使用现在写了两个Filter进行处理拼音分词问题一个是拼音转换Filter(Pinyin TransformTokenFilter)一个是拼音N-Gram的Filter(PinyinNGramTokenFilter),这样一来使用时就不用再添加索引前做拦音的转换了。而且Pinyin Transform TokenFilter 还有个好处就是它只使用中文分词器分过的词,也就是说做转换的词都是有用的不重复的,不会对没用的停词类的做拼音转换和重复拼音转换,这样大大的提高了拼音转换速度。
想要Solr支持拼音检索就要先把拼音分词(PinyinAnalyzer)的jar复制到\solr\contrib\analysis-extras\lib下,然后在schema.xml中配置一个拼音字段类型:
<fieldType name = "text_pinyin" class = "solr.TextField" positionIncrementGrap = "0">
<analyzer type = "index">
<tokenizer class = "org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory" />
<filter class = "org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory" />
<filter class = "com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLength = "2" />
<filter class = "com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram = "1" maxGram = "20" />
</analyzer>
<analyzer type = "query">
<tokenizer class = "org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory" />
<filter class = "org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory" />
<filter class = "com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLength = "2" />
<filter class = "com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram = "1" maxGram = "20" />
</analyzer>
</fieldType>
minTermLength:最小中文词长度,意思是小于这个值的中文词不会做拼音转换。
minGram:最小拼音切分长度。
如果想使用简拼的话在拼音转换Filter使用这个参数isFirstChar="true"就可以了。
在这个拼音类型中我们使用了smartcn的中言语分词器,如果想使用其他的自己换掉就行了。现在我们在原来索引中加入一个拼音字段,因为只做索引,我们可以这样配置:
<field name = "pinyin" type = "text_pinyin" indexed = "true" stored = "false" multiValued = "false" />
加完后我们重新启动Solr测试一下看看。
由于上面minTermLenght和minGram设置的值,现在出现了人没有进行拼音转换并且最小拼音切分是从1个开始的。
到这里我们的配置还有没完成,还要加几个copyFiled,这样就不用单独处理我们新加的拼音字段。
<copyField source = "context" dest = "pinyin" />
<copyField source = "text" dest = "spell" />
到现在就可以使用拼音检索了。
拼音分词器jar要复制到项目内。
Solr
调研总结
Solr
是什么?
Solr
它是一种开放源码的、基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中。
Solr
提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON等格式)。它易于安装和配置,而且附带了一个基于HTTP 的管理界面。可以使用
Solr
的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。S
1.当汉字个数小于等于三个汉字时,使用单个词库进行匹配(最大匹配法)
将汉字转为同音字,查询单个词库中的数据,选出音一样的词语列表,加上最小距离算法(保证至少一个汉字一样),得出一个列表,按照一定的算法排序后,选出最好的那个词语.
(词语库中词语定时更新,索引对应词语的查询结果)
2.当汉字个数在4到6个数目时,使用最大匹配切词法进行切词处理,切分为单个最大词后,使用1中的排序法则
2:如果是多个字段需要排序,需要注意一点:就是不能直接在一个string上添加,需要分别添加到orderList中,再赋值给OrderBy
var sortStr = "RankScore_d desc";
var sortStr1 = "grp_s desc";
List<SortOrder...
拼音
检索
的大致思路是这样的:
①将需要使用
拼音
检索
的字段汇集到一个
拼音
分词字段里(我的
拼音
分词字段使用pinyin4j+NGram做的);
加入两个jar包:pinyin4j-2.5.0.jar、pinyinAnaly...
网上看到别人写的,感觉挺强,以前还以为要实现输
拼音
缩写查询的话需要新增字段,如此以来就方便很多了。public class aaaaaaa {/** * 汉字转
拼音
缩写 * @param str //要转换的汉字字符串 * @return String //
拼音
缩写 */ public static String getPYString(String s
Solr
打分排序规则自定义
在搭建好
solr
Cloud搜索集群后,通过编写基本的查询显示语句已经能够通过输入关键字查询到相应结果进行显示,但是在显示结果排序上以及不相关信息过滤问题上,如何制定合理的打分规则得到理想的结果集确实比较麻烦的。
Solr
本身的排序打分规则是继承自Lucene的文本相关度的打分即boost,这一套算法对于通用的提供全文
检索
的服务来讲,已经够用了,但是想要根据实际业务需求定
&amp;amp;quot;chineseName&amp;amp;quot;: &amp;amp;quot;宋玉山&amp;amp;quot;,
&amp;amp;quot;englishName&amp;amp;quot;: &amp;amp;quot;&amp;amp