一、什么是分词
首先,Solr有自己基本的类型,string、int、date、long等等。
对于string类型,比如在你的core/conf/manage-schema文件中,配置一个字段类型为string类型,如果查询符合“我是中国人”的数据,它就认为“我是中国人”是一个词语。
但是如果你将该字段设置成了分词,即配置成了text_ik类型,就可能匹配“我”、“中国人”、“中国”、“中”、“人”带有这些字的该字段数据都可能被查询到。这就是分词带来的结果。具体要按照各自的业务来配置是否分词,分词对于大文本字段设置是合理的,但是对于小字段,设置分词是没必要的,甚至有相反的结果。比如你的某一个叫姓名的字段设置了分词,还不如设置string,查询时模糊匹配效果最好,(模糊匹配就是查询条件两边加上*),当然也要看自己业务需求是什么。
二、配置目地
就是让solr能对中文进行分词
三、分词器的选择
之前我们使用jieba分词,效果不是很好。
现在有个非常牛的分词器,IK 分词器,效果非常好,如果你一直使用solr 那么以后将一直使用IK分词器
中文分词在solr里面是没有默认开启的,需要自己配置一个中文分词器。
目前可用的分词器有smartcn,IK,Jeasy,庖丁。其实主要是两种,一种是基于中科院ICTCLAS的隐式马尔科夫HMM算法的中文分词器,如smartcn,ictclas4j,优点是分词准确度高,缺点是不能使用用户自定义词库;另一种是基于最大匹配的分词器,如IK ,Jeasy,庖丁,优点是可以自定义词库,增加新词,缺点是分出来的垃圾词较多。各有优缺点。
主流还是ik,可以扩展自己的词库,非常方便,加入一些热搜词,主题词,对于搜索而言,非常方便
四、分词器的的配置
4.1 下载
下载ik (5及以上版本通用) http://files.cnblogs.com/files/zhangweizhong/ikanalyzer-solr5.zip
4.2 解压文件及说明
ext.dic自定义词 如沙雕 在汉语里面不是一个词 ,它只是一个网络用语,可以配置到这=里面让它成为一个词
stopword.dic 停止字典 如 啊 吧 唉 不作分词
IKAnalyzer.cfg.xml配置ik的配置文件 不用改
Jar:如果要使用ik分词要导入的jar包
4.3 修改managed-schema
UseSmart 和分词的粒度相关:
False: 分词的粒度大,一句话里面分的词语少
True:分词的粒度细,一句话里面分的词语多
那我们在导入时需要的关键字多吗?让索引的数据量少一点。我们的粒度大:False
我们在搜索时需要的关键字多吗?我们想尽可能的覆盖所有的范围,我们的粒度要细:True
<!--添加一个中文分词器IK--> <fieldType name="text_cn" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="false"/> </analyzer> <analyzer type="query"> <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/> </analyzer> </fieldType>
4.4 把修改managed-sahma覆盖到solr
4.5 重启solr
4.6 查看分析出现错
产生原因是因为我们只添加发分词
但是ik想要运行必须要加入相关的配置
上面的配置没有加入
4.7 把IK的配置入到solr
4.7.1,放入jar包
4.7.2,放配置
在/usr/local/solr-7.7.2/server/solr-webapp/webapp/WEB-INF创建一个classes
4.8,重启solr分析
4.9存在问题
要索引时要遵循一个原因
1,索引时分词的要尽量少
2,搜索时分词尽量多
改完重新覆盖,重启测试
到此为止,全部配置成功!!!
五、使用IK分词器
5.1 添加一个属性
添加数据测试下
查看分词
查询测试
为什么pro3有 pro没有 因为ik分词时认为pro3是一个词 而pro不是词
5.2 ext.dic的说明
在ext.dic里添加一个自定义的词 沙雕
覆盖 查询
重启测试
发现现在solr认为 沙雕就是一个词