solr4.8中集成mmseg4j1.9.1
要想在Solr中整合mmseg4j其实很容易,只需要如下几个步骤
1、下载(https://code.google.com/p/mmseg4j/downloads/list)并解压mmseg4j-1.9.1.zip,把dist下面的所有jar文件拷贝到你应用服务器下的solr/WEB-INF/lib中。(如果你的应用服务器下面没有solr,请参考《Tomcat中安装Solr》)。
有3个jar文件:mmseg4j-analysis-1.9.1.jar, mmseg4j-core-1.9.1.jar,mmseg4j-solr-1.9.1.jar。
顺便提下,如果是在mmseg4j-1.9.0前,则需要copy data目录到solr_home/solr中(与core平级),并改名为dic。进入到你想使用mmseg4j分词器的core中(此处以solr自带的collection1为例),用编辑器打开collection1/conf/schema.xml配置文件,添加如下代码:
- <!-- mmseg4j分词器 -->
- <fieldType name="text_mmseg4j" class="solr.TextField" >
- <analyzer type="index">
- <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="../dic" /><!--此处为分词器词典所处位置-->
- </analyzer>
- <analyzer type="query">
- <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="../dic" /><!--此处为分词器词典所处位置-->
- </analyzer>
- </fieldType>
2、在mmseg4j-1.9.0后,如本例的mmseg4j-1.9.1中,就 可以不用 dicPath 参数,可以使用 mmseg4j-core-1.9.0.jar 里的 words.dic ,在Schema.xml中加入如下配置
- <!-- 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-->
3、引用mmseg4j分词器
只需要在该schema.xml中加入如下配置便可引用对应的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分词器到solr中了。
然后就可以打开Solr Admin的Page进行分词分析了。但当输入中文(华南理工大学)并点击“Analyse Values”进行分析时,会发现如下的错误: 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.

该原因是源码的一个bug引起的,需要修改上面下载的mmseg4j-analysis-1.9.1.zip解压后的mmseg4j-analysis目录下的类:MMSegTokenizer.java,修改reset()方法并加上下面注释中的这一句“ super.reset(); ”
- public void reset() throws IOException {
- //lucene 4.0
- //org.apache.lucene.analysis.Tokenizer.setReader(Reader)
- //setReader 自动被调用, input 自动被设置。
- super.reset(); //加这一句
- mmSeg.reset(input);
- }
修改后运行mvn clean package -DskipTests进行打包得到最新的mmseg4j-analysis-1.9.1.jar 并替换Tomcat下的solr下的WEB-INF/lib下的mmseg4j-analysis-1.9.1.jar。
重新启动Tomcat并访问Solr Admin Page,并在“Analysis”中输入中文进行分析,可以看到已经成功的进行分析。

这样这个Bug就解决了。
另外,mmseg4j中文分词和庖丁中文分词的对比效果可以参照下面的结果,从结果可以看出,mmseg4j比起庖丁中文分词来说,是更好的选择。
paoding 几乎把所有的子词都拆出来,有时候还有最长的词,还没搞懂“华南理工大学”会分出“大”;mmseg4j 的 maxword 是在 complex分词后的结果再把子词都拆出来。
如“化装和服装” mmseg4j 的 complex是可以较好的分出来(“化装 | 和 | 服装”),而 paoding 少了字频的信息,比较难到这事。mmseg4j complex 也有个缺点:“都是先从容易的做起” 不能把“容易”分出来,这是因为 mmseg 算法是用 3 个chunk的原因,我认为把整句的 chunk (还是仅仅3个chunk)来处理的话,分词效果要好),当然要更多的开销,选3个可能是效果与性能平衡吧。
mmseg4j 没有加任何 stopword,这东西留给使用者自己加,因为我不认为加 stopword 是好的方法。如音乐搜索,给加上 the,this……,还能找到歌曲?
当然分词效果还与词库有关,sogou 的词库是统计得出,有些高频的单字组合也成了词,如“我们的”。如果还要提高 mmseg4j 的分词效果,还要在整理下词库。
mmseg4j中的词库:(强制使用 UTF-8):
- data/chars.dic 是单字与语料中的频率,一般不用改动,1.5版本中已经加到mmseg4j的jar里了,我们不需要关心它,当然你在词库目录放这个文件可以覆盖它。
- data/units.dic 是单字的单位,默认读jar包里的,你也可以自定义覆盖它,这个功能是试行,如果不喜欢它,可以用空的units.dic文件(放到你的词库目录下)覆盖它。
- data/words.dic 是词库文件,一行一词,当然你也可以使用自己的,1.5版本使用 sogou 词库,1.0的版本是用 rmmseg 自带的词库。
- data/wordsxxx.dic 1.6版支持多个词库文件,data 目录(或你定义的目录)下读到"words"前缀且".dic"为后缀的文件。如:data/words-my.dic。
- 由于 utf-8 文件有带与不带 BOM 之分,建议词库第一行为空行或为无 BOM 格式的 utf-8 文件。
solr4.8中集成mmseg4j1.9.1的更多相关文章
- Solr4.10.2集成Nutch1.9与自带UI界面使用
Solr4.10.2集成Nutch1.9与自带UI界面使用 一.Solr4.10.2与Nutch1.9集成 环境:Solr4.10.2已经配置在Tomcat上 Solr的Tomcat配置详见Solr4 ...
- solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件
昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...
- [译]MVC网站教程(四):MVC4网站中集成jqGrid表格插件(系列完结)
目录 1. 介绍 2. 软件环境 3. 在运行示例代码之前(源代码 + 示例登陆帐号) 4. jqGrid和AJAX 5. GridSettings 6. ...
- 如何在 ASP.NET MVC 中集成 AngularJS(3)
今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...
- 如何在 ASP.NET MVC 中集成 AngularJS(2)
在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...
- 如何在ios中集成微信登录功能
在ios中集成微信的登录功能有两种方法 1 用微信原生的api来做,这样做的好处就是轻量级,程序负重小,在Build Settings 中这样设置 然后设置 友盟的设置同上,但是要注意,加入你需要的所 ...
- 在Application中集成Microsoft Translator服务之开发前准备
第一步:准备一个微软账号 要使用Microsoft Translator API需要在Microsoft Azure Marketplace(https://datamarket.azure.com/ ...
- 在Abp中集成Swagger UI功能
在Abp中集成Swagger UI功能 1.安装Swashbuckle.Core包 通过NuGet将Swashbuckle.Core包安装到WebApi项目(或Web项目)中. 2.为WebApi方法 ...
- 如何在 ASP.NET MVC 中集成 AngularJS(1)
介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新 ...
随机推荐
- 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它
dpkg应用程序被占用 错误提示: E: 无法获得锁 /var/lib/dpkg/lock – open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他 ...
- andriod sdk 模拟器的安装以及root
安卓模拟器常用的一共2种java sdk 和 bluestacks 蓝手指.前者比较卡,后者貌似不能模拟2g/3g上网. 本文主要是针对java sdk的安装使用,以及root.关于root的意思 ...
- Windows 10 SDK 10.0.10069 : The installer failed. User cancelled installation. Error code: -2147023294
注* 请先跳到文章后面的配置“操作系统的区域设置”部分,然后尝试重试安装VS,如果仍然失败,请看下面内容. 安装UAP SDK失败 Visual Studio 2015 RC Community 安装 ...
- git教程4-创建分支与删除分支
一.分支的理解 分支,即branch,用于从主分支(master)中新开辟出一个分支,用于对文件进行修改.这部分修改的内容在新的分支未融合到主分支的情况下,主分支是看不见的.新的分支相当于开辟了新的修 ...
- Unity3D教程:制作与载入AssetBundle
通常我们在游戏程式执行过程,并不希望一次将全部的资源都载入,而比较希望实际上有使用到的才载入,以免占用多余的记忆体,所以我们可能会尽量规划好不同功能的场景,在需要时才载入场景并释放掉前个场景中不需要的 ...
- python_广州房价热力图
调用百度地图api,获取经纬度数据,然后在调用百度地图api,生成热力图 import pandas as pd import numpy as np data = pd.read_excel(r'D ...
- redis3.2.11 安装
wget http://download.redis.io/releases/redis-3.2.11.tar.gz [root@hdp01 src]# .tar.gz -C /opt/ [root@ ...
- 滑雪(经典DP思想)
个人心得:思想还是不够,开始自己写但是不知道如何记录长度,也不太知道状态的转移,后面看了百度, 发现人人为我我为人人就是一步一步推导, 而递归思想就要求学会记录和找到边界条件,这一题中的话就是用递归, ...
- 学习动态性能表(8)--v$lock&v$locked_object
学习动态性能表 第八篇-(1)-V$LOCK 2007.5.31 这个视图列出Oracle 服务器当前拥有的锁以及未完成的锁或栓锁请求.如果你觉着session在等待等待事件队列那你应该检查本视图. ...
- HIVE-分区表详解以及实例
HIVE中的分区表是什么,我们先看操作,然后再来体会. 创建一个分区表,分区的单位时dt和国家名 hive> create table logs(ts bigint,line string) & ...