一、简介
分析器是solr中一个很重要的组件,在建立索引、搜索出想要的结果时,发挥了非常大的作用,这是solr已经定义好的一段包含分析器的fieldType示例
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.EnglishPossessiveFilterFactory"/> <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> <filter class="solr.PorterStemFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/> <filter class="solr.StopFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.EnglishPossessiveFilterFactory"/> <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> <filter class="solr.PorterStemFilterFactory"/> </analyzer> </fieldType>
1.分析器(Analyzer)
告诉Solr在建立索引和搜索的时候,如何处理文档内容,类型(type)一般为index或query
2.分词器(Tokenizer):
如何将一段完整的内容拆分成单独的词或词组,solr中定义了很多带分析器的文本类型,但中文的需要自己定义,目前有很多优秀的中文分词器(mmseg4j、IK等)
3.过滤器(Filter)
进过Tokenizer处理后,后续处理的组件,比如全转成小写等
4. Why?
为什么要用分词,以查询一段文字“詹姆斯:NBA巨星,首轮状元秀,绰号小皇帝。”(对应的field未定义任何的分词器),我们如果查询“状元秀”,是查不到这条记录的,当然你说可以加通配符,但是如果我们还要做高亮显示查询的这个词呢?
这时如果我们将对应字段的类型加上index分词器,在建立索引时就会对内容进行合适的拆分,查询时也会对查询字符串进行分词拆分,这样即使我们查询“小皇帝状元秀”也可以获得我们想要的结果
二、分析器的配置(中文分词mmseg4j的配置)
这里我solr的版本是6.5.0,mmseg4j的版本是2.4.0
1. 常用中文分词介绍
paoding:支持不限制个数的用户自定义词库,纯文本格式,一行一词,使用后台线程检测词库的更新,自动编译更新过的词库到二进制版本,并加载
mmseg4j:自带sogou词库,支持名为 wordsxxx.dic, utf8文本格式的用户自定义词库,一行一词。不支持自动检测。 -Dmmseg.dic.path
IK:支持api级的用户词库加载,和配置级的词库文件指定,无 BOM 的 UTF-8 编码,/r/n 分割。不支持自动检测。
2.mmseg4j分词器配置
将下载好的mmseg4j包导入到solr的WEB-INF/lib下,并在schema配置文件中添加以下内容:
<fieldType name="text_mmseg4j_Complex" class="solr.TextField"> <analyzer> <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="dic"/> </analyzer> </fieldType>
将之前定义的core_test中short_desc字段定义为text_mmseg4j_Complex类型,重建索引后,我们查询"状元秀小皇帝",只返回了一条记录
{ "responseHeader" : { "status" : 0, "QTime" : 2, "params" : { "q" : "short_desc:状元秀小皇帝", "indent" : "on", "wt" : "json", "_" : "1493135606415" } }, "response" : { "numFound" : 1, "start" : 0, "docs" : [{ "name" : "LeBron James", "id" : "12b3e4b030314f55a89006769b8b743a", "short_desc" : "NBA巨星,首轮状元秀,克里夫兰骑士队当家球星,3届总冠军得主,场上司职小前锋,绰号“小皇帝”", "age" : 32, "tags" : ["小皇帝", "吾皇"], "_version_" : 1565666158942617600 }] } }
用提供的分析器页面也可以看到分词的结果比原来用标准分词器(完全拆成了一个个的汉字,而忽了语义)更符合自然意义
//mmseg4j基于正向最大匹配,分词结果 MMST 状元 秀 小 皇帝
3.mmseg4j的三种模式区别
mmseg4j涉及到了Simple、Complex、max-word三种分词方法,前两个都是基于正向最大匹配,第三种是在Complex算法基础上实现的最多分词方法。
1)正向最大匹配:就是将一段字符串进行分隔,其中分隔 的长度有限制,然后将分隔的子字符串与字典中的词进行匹配,如果匹配成功则进行下一轮匹配,直到所有字符串处理完毕,否则将子字符串从末尾去除一个字,再进行匹配,如此反复。
2)三种模式分词实例
原字符串:阿根廷足球巨星
Simple、Complex分词结果:阿根廷 足球巨星
Max-Word分词结果:阿 根 廷 足球 巨星
三.自定义词库
可能注意到前面tokenizer配置了dicPath属性(dic),这里是指定自定义词库的目录,可以是绝对路径也可以是现对路径,相对路径为"{solr.home}/core_name/词库目录",词库文件words开头并以".dic"结尾,如words-myown.dic。
注意,如果你的词库文件也是words.dic会覆盖对应solr-core.jar包中预定义的词库文件。
1.动态加载词库
通过一个简单的配置就可以让mmseg4j动态加载词库
首先在solrconfig.xml中配置一个requestHandler,其中dicPath和fieldType配置的dicPath属性值相同
<requestHandler name="/mmseg4j" class="com.chenlb.mmseg4j.solr.MMseg4jHandler" > <lst name="defaults"> <str name="dicPath">dic</str> </lst> </requestHandler>
然后我们就可以通过URL(http://localhost:10001/solr/core_test/mmseg4j?reload=true)来通知其重新加载词库
相关推荐
IK Analyzer是什么呢,就是我们需要的这个工具,是基于java开发的轻量级的中文分词工具包。它是以开源项目Luence为主体的...如果使用中文分词器ik-analyzer,就需要在索引和搜索程序中使用一致的分词器:IK-analyzer。
IkAnalyzer3.2的jar包 ...Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IK Analyzer 3.X 则发展为面向Java 的公用分词组件,独立于Lucene 项目,同时提供了对 Lucene 的默认优化实现。
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词...
利用IKAnalyzer分词器来做文章的匹配算法。主要思想是先用IKAnalyzer分词器分析2篇文章,然后把2篇文章的关键字进行比较,如果相同的个数在所有关键字的总数大于某个预设的值,就认为2篇文章是相同的。
IK Analyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版... 在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化。
solr配置用到的IKAnalyzer分析器所需要的jar包及配置文件
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。 采用了特有的“正向迭代最细粒度切分算法”,具有60万字/秒的高速处理能力。 采用了多子处理器分析模式,支持:英文字母(IP地址、Email、...
内容直接拷贝进stopword.dic即可使用(2614行常用停用词包含中英文,符号等)
1.IKAnalyzer3.0介绍 IKAnalyzer是一个开源的,基于java... * 针对Lucene全文检索优化的查询分析器IKQueryParser(作者吐血推荐);采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。
IKAnalyzer中文分词器V3[1].2.3使用手册.pdf
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词...
采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的...针对Lucene全文检索优化的查询分析器IKQueryParser(作者吐血推荐);采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。
IK Analyzer 是一个开源的,基于java 语言开发的轻量级的中文分词工具包。从2006 年12 月推出1.0 版开始, IKAnalyzer 已经推出了3 个大版本。最初,它是以开源项目 Luence 为应用主体的,结合词典分词和文法分析...
IKAnalyzer.rar中文分析器
最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开 始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK...
BerkeleyParser 伯克利文本分析器
在2012版本中,IK实现了简单的分词 歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。 IK Analyzer 2012特性: 采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式; ...
主要对中英文文本进行分词,关键词提取,词云绘图等。
论文中用到的部分基础文本分析技术(包括分词、去除停用词、word2vec、TF-IDF、词云图、名称提取、词性标注、LDA主题模型)