拼音检索中国人的专用检索,例如:中文内容为“中国”的输入 “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之拼音检索。相关推荐

  1. C# 通过拼音检索中文名称

    转自:http://blog.csdn.net/wu_zheng_peng/article/details/8639828 using System; using System.Collections ...

  2. 支持拼音检索的TextBox扩展控件-使用

    我的上一个支持拼音检索的TextBox扩展控件,由于有些网友留言和发邮件问如何用, 如:菜鸟AAA等当时想到肯定大家都会用,就没上传示例程序. 原文为:http://www.cnblogs.com/w ...

  3. 拼音检索VS五笔检索---Javascript实现

    前段时间在研究用js 实现拼音首字母以及五笔首字符的检索,呵呵,终于实现了.找了好多资料.方法也是多样的.就是检索的内容多了.循环的次数多,导致检索有点慢,也有可能我写的js也不是特别的精炼,但是不管 ...

  4. ElasticSearch学习(四)—— 中文按拼音排序拼音检索

    使用pinyin分词器 下载拼音分词器https://github.com/medcl/elasticsearch-analysis-pinyin 解压进入目录elasticsearch-analys ...

  5. 如何在大型系统中提供拼音检索服务

    最近有这么一个需求,客户要求在选择一些业务数据时,能提供类似谷歌的拼音检索功能,由于目前系统中的业务数据都是存储在数据,而且 数据量都比较大,目前主要考虑两种实现方式:   第一种通过构建一个包含有所 ...

  6. easyui combobox 拼音检索快捷选择输入

    easyui combobox 拼音检索快捷选择输入 效果如图 $.ajax({url: UserActionUrl + '?action=listuserworktype',dataType: 'j ...

  7. 集合(7)——Dictionary字典(2)——C#中的拼音检索

    1.为什么要用拼音检索?坐席只能根据客户的语言进行判断,无法准确写对姓名. 2.Visual Studio International Pack 3.练习:根据文档学习使用方法.发下安装包自己探索.目 ...

  8. 前端拼音检索-【pinyin-match】

    前端开发时,有时数据过多需要快速检索功能,常用的关键字匹配和拼音检索,发现一个不错的插件pinyin-match. 个人感觉应用场景为,数据量不是特别大,一次性加载到前端,由前端实现过滤.数据过大时还 ...

  9. 【Solr】 solr对拼音搜索和拼音首字母搜索的支持

    问:对于拼音和拼音首字母的支持,当你在搜商品的时候,如果想输入拼音和拼音首字母就给出商品的信息,怎么办呢? 实现方式有2种,但是他们其实是对应的.  用lucene实现 1.建索引, 多建一个索引字段 ...

最新文章

  1. 在.Net中,如何创建一个后台执行的进程?
  2. python之数据库连接
  3. 程序员的10个神秘等式
  4. 云服务器支持javascript,云服务器支持javascript
  5. 不容易,今天的成果。
  6. 支付宝客户端java版_支付宝对接支付-JAVA版
  7. 剖析车联网的完美形态,机器人化还是智能交通?
  8. smartsvn基本操作
  9. Python学习——语法错误与异常
  10. 服务器端身份验证技术,身份认证技术和协议的常用方法
  11. 数据分析之北京房价复习
  12. 揪出键盘上的“老鼠”
  13. 6.process.nextTick()
  14. c++ 问题:查找预编译头时遇到意外的文件结尾
  15. 【Sublime Text 3】Sublime Text 3 - cracked 3086
  16. mac电脑打不开应用程序的解决方法
  17. OpenGL(四) 左右手坐标系及基本坐标变换
  18. 蚊子看了想咬人,人类看了都说好
  19. word打不开,提示“很抱歉,无法打开...docx,因为内容有问题。”的解决----亲测,写的论文出现此问题打不开吓尿了
  20. 优思学院|略谈六西格玛管理理论是如何发展起来的?

热门文章

  1. 陈伊力:手游将会出现更多同步交互类游戏
  2. 木纤维增强聚丙烯复合材料:压缩和注塑成型工艺
  3. 热销超极本iFunk翼S到底怎么样?
  4. 安装ie9提示未能完成安装_win7系统安装Ie提示“Internet explorer未能完成安装”的解决方法...
  5. uni-app app平台微信支付
  6. 病毒木马查杀实战第024篇:MBR病毒之编程解析引导区
  7. 三星手机和计算机如何连接打印机,三星打印机连接到电脑没反应怎么办
  8. 从ServerSwitch到SONiC Chassis:数据中心交换机技术的十年探索历程
  9. 微信小程序+SpringBoot实现校园快递代收平台
  10. 论文阅读:A Survey on Why-Type Question Answering Systems