全文检索引擎Solr系列——整合中文分词组件mmseg4j
默认Solr提供的分词组件对中文的支持是不友好的,比如:“VIM比作是编辑器之神”这个句子在索引的的时候,选择FieldType为”text_general”作为分词依据时,分词效果是:
它把每一个词都分开了,可以想象如果一篇文章这样分词的搜索的体验效果非常差。能够和Solr集成的中文分词组件有很多,比如:mmseg4j、IkAnalyzer、ICTCLAS等等。各有各的特点。这篇文章讲述如何整合Solr与mmseg4j。mmeseg4j最新版本是1.9.1,下载解压,提取其中的三个文件:mmseg4j-analysis-1.9.1.jar, mmseg4j-core-1.9.1.jar,mmseg4j-solr-1.9.1.jar。放到目录:E:\solr-4.8.0\example\solr-webapp\webapp\WEB-INF\lib,修改配置文件schema.xml,添加下面的两段代码:
fieldType:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
 | 
<!-- mmseg4j--><fieldType name="text_mmseg4j_complex" class="solr.TextField" positionIncrementGap="100" >      <analyzer>          <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="dic"/>      </analyzer>  </fieldType>  <fieldType name="text_mmseg4j_maxword" class="solr.TextField" positionIncrementGap="100" >      <analyzer>          <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="dic"/>      </analyzer>  </fieldType>  <fieldType name="text_mmseg4j_simple" class="solr.TextField" positionIncrementGap="100" >      <analyzer>        <!--        <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="n:/OpenSource/apache-solr-1.3.0/example/solr/my_dic"/>         -->        <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="dic"/>         </analyzer>  </fieldType><!-- mmseg4j--> | 
与fieldType对应的field:
| 
 1 
2 
3 
4 
5 
 | 
<!-- mmseg4j --><field name="mmseg4j_complex_name" type="text_mmseg4j_complex" indexed="true" stored="true"/><field name="mmseg4j_maxword_name" type="text_mmseg4j_maxword" indexed="true" stored="true"/><field name="mmseg4j_simple_name" type="text_mmseg4j_simple" indexed="true" stored="true"/><!--mmseg4j --> | 
此时就算配置完成了,重启服务:java -jar start.jar,来看看mmseg4j的分词效果怎么样,打开Solr管理界面,点击左侧的Analysis页面
对比之前的分词效果,改进了很多,差不多就是正常的语义了。这里在分词的时候你有可能会遇到一个问题:
TokenStream contract violation: reset()/close() call missing, reset() called multiple times, or subclass does not call super.reset(). Please see Javadocs of TokenStream class for more information about the correct consuming workflow.
这个是Solr4.8环境下mmseg4j的一个bug,这是mmseg4j-analysis-1.9.1.jar引起的,需要修改源码,找到文件:mmseg4j-1.9.1\mmseg4j-analysis\src\main\java\com\chenlb\mmseg4j\analysis\MMSegTokenizer.java,加上super.reset():
| 
 1 
2 
3 
4 
5 
6 
7 
 | 
public void reset() throws IOException {    //lucene 4.0    //org.apache.lucene.analysis.Tokenizer.setReader(Reader)    //setReader 自动被调用, input 自动被设置。    super.reset(); //加上这一行    mmSeg.reset(input);} | 
修改完之后用maven重启编译:mvn clean package -DskipTests,用新的mmseg4j-1.9.1\mmseg4j-analysis\target\mmseg4j-analysis-1.9.2-SNAPSHOT.jar替换掉原来那个文件,重启服务就ok了。
mmeseg4j-1.9.1这个版本的的词库全部打包放在了jar文件里面,因此无需再指定词库文件(chars.dic,units.dic,words.dic),当然你也可以覆盖这些文件,只需要吧预替换的文件放在在WEB-INF\data\即可。
现在添加两个中文文档到索引中去,试试mmeseg4j的效果怎么样:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
 | 
<add>      <doc>          <field name="id">0001</field>          <field name="mmseg4j_complex_name">把Emacs比作是神的编辑器,VIM比作是编辑器之神,2012年开始接触VIM,一直沿用至今,也曾今总结过VIM的相关知识,文章都整理在以前的ITeye博客和GitHub,这款古而不老的编辑器至今仍受众多程序员追捧,当然我也是忠实的VIM用户,这篇文章就是用VIM编辑完成。</field>      </doc>      <doc>          <field name="id">0002</field>          <field name="mmseg4j_complex_name">用Google搜索"Python IDE",第一条就是stackoverflow上一个非常热门的问题:"what IDE to use for Python",上百种编辑器的功能对比图让人眼花缭乱。其中有我接触过的几款编辑器(IDE)包括:Eclilpse(PyDev)、VIM、NotePad++、PyCharm。如果你的日常开发语言是Python的话,再搜索"python vim",大约有328万条结果,可见用VIM做Python开发的程序员那是相当之多,我大概总结的几点原因,当然不一定正确</field>      </doc>  </add> | 
保存为utf-8格式的文件名:mmseg4j-solr-demo-doc.xml,加入到Solr中去:
| 
 1 
2 
3 
4 
5 
6 
7 
 | 
E:\solr-4.8.0\example\exampledocs>java -jar post.jar mmseg4j-solr-demo-doc.xmlSimplePostTool version 1.5Posting files to base url http://localhost:8983/solr/update using content-type application/xml..POSTing file mmseg4j-solr-demo-doc.xml1 files indexed.COMMITting Solr index changes to http://localhost:8983/solr/update..Time spent: 0:00:01.055 | 
看搜索结果:
全文检索引擎Solr系列——整合中文分词组件mmseg4j的更多相关文章
- 全文检索引擎Solr系列——整合中文分词组件IKAnalyzer
		
IK Analyzer是一款结合了词典和文法分析算法的中文分词组件,基于字符串匹配,支持用户词典扩展定义,支持细粒度和智能切分,比如: 张三说的确实在理 智能分词的结果是: 张三 | 说的 | 确实 ...
 - 全文检索引擎Solr系列——整合MySQL、MongoDB
		
MySQL 拷贝mysql-connector-java-5.1.25-bin.jar到E:\solr-4.8.0\example\solr-webapp\webapp\WEB-INF\lib目录下面 ...
 - [摘]全文检索引擎Solr系列—–全文检索基本原理
		
原文链接--http://www.importnew.com/12707.html 全文检索引擎Solr系列—–全文检索基本原理 2014/08/18 | 分类: 基础技术, 教程 | 2 条评论 | ...
 - 全文检索引擎Solr系列—–全文检索基本原理
		
场景:小时候我们都使用过新华字典,妈妈叫你翻开第38页,找到“坑爹”所在的位置,此时你会怎么查呢?毫无疑问,你的眼睛会从38页的第一个字开始从头至尾地扫描,直到找到“坑爹”二字为止.这种搜索方法叫做顺 ...
 - Solr整合中文分词组件IKAnalyzer
		
我用的Solr是4.10版本, 在csdn下载这个版本的IKAnalyzer:IK Analyzer 2012FF_hf1.zip 解压后目录如下: (1)这里还用solr自带的example实验分词 ...
 - 全文检索引擎Solr系列——Solr核心概念、配置文件
		
Document Document是Solr索引(动词,indexing)和搜索的最基本单元,它类似于关系数据库表中的一条记录,可以包含一个或多个字段(Field),每个字段包含一个name和文本值. ...
 - 全文检索引擎Solr系列——solr入门
		
下载4.8.0版本,下载地址:http://archive.apache.org/dist/lucene/solr/4.8.0/ 解压后,得到文件夹视图如下: 解压缩solr,在example目录有s ...
 - 全文检索引擎 Solr 部署与基本原理
		
全文检索引擎 Solr 部署与基本原理 搜索引擎Solr环境搭建实例 关于 solr , schema.xml 的配置说明 全文检索引擎Solr系列-–全文检索基本原理 一.搜索引擎Solr环境搭建实 ...
 - 全文检索引擎Solr 指南
		
全文检索引擎Solr系列:第一篇:http://t.cn/RP004gl.第二篇:http://t.cn/RPHDjk7 .第三篇:http://t.cn/RPuJt3T
 
随机推荐
- shell awk实战
			
一.文本处理 1.按行提取关键字频次(如取第5列) awk 'BEGIN{FS="|"} {a[$5]+=1;} END {for(i in a) print i ":& ...
 - MFC中使用用户剪贴板
			
代码逻辑: 拷贝功能: 1.从编辑控件中获取文本. 2.打开并清空剪贴板.(OpenClipboard,EmptyClipboard) 3.创建一个全局缓冲区.(GlobalAlloc) 4.锁定缓冲 ...
 - 4.GIT安装
			
最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和Window ...
 - Python垃圾回收机制详解转自--Kevin Lu
			
一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. #e ...
 - libx264 安卓编译
			
https://github.com/RoyGuanyu/build-scripts-of-ffmpeg-x264-for-android-ndk/blob/master/ffmpeg/build_a ...
 - 记CM+kerberos环境停电后无法启动报错An error: (java.security.PrivilegedActionException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism leve
			
公司突然停电,然后cm环境无法重启,报错 An error: (java.security.PrivilegedActionException: javax.security.sasl.SaslExc ...
 - 创建Java不可变类
			
不可变(immutable)类的意思是创建该类的实例后,该实例的Field是不可改变的,Java提供的8个包装类和java.lang.String类都是不可变类. 如果需要创建自定义的不可变类,可遵守 ...
 - Spring框架第五篇之Spring与AOP
			
一.AOP概述 AOP(Aspect Orient Programming),面向切面编程,是面向对象编程OOP的一种补充.面向对象编程是从静态角度考虑程序的结构,而面向切面编程是从动态角度考虑程序运 ...
 - yii2 中where条件查询
			
在Yii的Model里进行查询的时候 where是必不可少的. Where方法声明为 static where( $condition ) 其中参数 $condition 类型为字符串或者数组1.字符 ...
 - Java数据结构——循环链表的实现
			
//单链表结点类 public class Node<T> { //单链表结点类,T指定结点的元素类型 public T data; //数据域,保存数据元素 public Node< ...