smartcn和ik的对比,来自http://www.cnblogs.com/hadoopdev/p/3465556.html

一、引言:

年的时候,就曾经有项目涉及到相关的应用(Lunce构建全文搜索引擎),那时的痛,没想到5年后的今天依然存在,切分效果、扩展支持、业务应用等方面依然不甚理想。收费的版本不提了,原因自不必言表,开源版本中,发现之前曾经活跃的版本,大多已经没落(好几年没更新了),存活下来的寥寥无几。我是一个守旧的人,评估版本的选择有些保守,至少目前为止,只看1.0正式版本之后的版本,0.XX的不在考虑范围之内,用了一个周末的时间,对比了十多款的样子,个人感觉源于中科院ICTCLAS的smartcn和IKAnanlyzer效果还是不错的。

二、结果对比

2.1 原始文本

"lucene\分析器\使用\分词器\和\过滤器\构成\一个\"管道",文本\在\流经\这个\管道\后\成为\可以\进入\索引\的\最小单位,因此,一个\标准\的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";
2.2 smartcn

lucen\分析器\使用\分词\器\和\过滤器\构成\一个\管道\文本\流经\这个\管道\后\成为\可以\进入\索引\最\小\单位\因此\一个\标准\分析器\有\两\个\部分\组成\一个\分词\器\token\它\用于\将\文本\按照\规则\切分\为\一个\个\可以\进入\索引\最\小\单位\另外\一个\tokenfilt\它\主要\作用\对\切\出来\词\进行\进一步\处理\如\去掉\敏感\词\英文\大小写\转换\单\复数\处理\等\lucen\中\tokenstram\方法\首先\创建\一\个\token\对象\处理\reader\对象\中\式\文本\然后\利用\tokenfilt\对\输出\进行\过滤\处理\

2.3 IKanalyzer

lucene\分析器\分析\器使\使用\分词器\分词\器\和\过滤器\过滤\滤器\构成\一个\一\个\管道\文本\在\流经\这个\管道\后\成为\可以\进入\索引\的\最小\单位\因此\一个\一\个\标准\的\分析器\分析\器\有\两个\两\个\部分\分组\组成\一个是\一个\一\个\是\分词器\分词\器\tokenizer\它用\用于\将\文本\按照\规则\切分\切\分为\一个个\一个\一\个个\个\个\可以\进入\索引\的\最小\单位\另外\一个是\一个\一\个\是\tokenfilter\它\主要\作用\用是\对\切出来\切出\切\出来\的\词\进行\行进\进一步\进一\一步\一\步\的\处理\如\去掉\敏感\词\英文\大小写\大小\小写\转换\单\复数\处理\等\lucene\中\的\tokenstram\方法\首先\创建\一个\一\个\tokenizer\对象\处理\reader\对象\中\的\流式\文本\然后\利用\tokenfilter\对\输出\流进\进行\过滤\处理\

 

我的选择:虽然IK有很多碎片,但是可以提高查询的准确率。碎片带来的效果就是,需要占用更大的空间。最终仍然选择IK,原因如下:

比如我输入"北京市美食",如果使用smartcn,将会分词为"北京市""美食",那么如果文档中存储的是"北京美食"就查询不到了。

以下介绍solr 5.X版本中IK的配置,来自http://www.cnblogs.com/zhangweizhong/p/5593909.html

  1. 首先,下载IKAnalyzer ,下载

    注意:以前老的IK 不支持Solr 5.3的版本
,请注意下载最新的。

 
 

  2. 将ik的相关文件
拷贝到 webapps\solr\WEB-INF\lib 目录下

 
 

  3. 在 solr_home\mycore1\conf\schema.xml 增加如下配置

<!-- 我添加的IK分词 -->

<fieldType name="text_ik"
class="solr.TextField">

<analyzer type="index" isMaxWordLength="false"
class="org.wltea.analyzer.lucene.IKAnalyzer"/>

<analyzer type="query" isMaxWordLength="true"
class="org.wltea.analyzer.lucene.IKAnalyzer"/>

</fieldType>

   同时,把需要分词的字段,设置为text_ik,

  <field name="id" type="int" indexed="true" stored="true" required="true" multiValued="false" />

<field name="name" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" />

<field name="title" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" />

<field name="category" type="int" indexed="true" stored="true" required="true" multiValued="false" />

<field name="content" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" />

<field name="price" type="double" indexed="true" stored="true" required="true" multiValued="false" />

<field name="color" type="string" indexed="true" stored="true" required="true" multiValued="false" />

<field name="orderBy" type="int" indexed="true" stored="true" required="true" multiValued="false" />

<field name="updatetime" type="date" indexed="true" stored="true" required="true" multiValued="false" />

 
 

  4. 重启服务

    注意:如果之前已经创建了索引,需要将之前的索引删掉,重新创建分词后的索引。

 
 

  5. 在admin后台, analysis 下查看分词效果

    1. 中文分词效果

    

    2. 索引查询效果

    

 
 

  6. 配置IKAnalyzer分词器的扩展词典,停止词词典

    1. 将
文件夹下的IKAnalyzer.cfg.xml , ext.dic和stopword.dic 三个文件 复制到/webapps/solr/WEB-INF/classes 目录下,并修改IKAnalyzer.cfg.xml

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

    <properties>

     <comment>IK Analyzer 扩展配置</comment>

     <!--用户可以在这里配置自己的扩展字典 -->

    <entry key="ext_dict">ext.dic;</entry>

 

     <!--用户可以在这里配置自己的扩展停止词字典-->

    <entry key="ext_stopwords">stopword.dic;</entry>

    </properties>

     

 
 

    注意:  记得将stopword.dic,ext.dic的编码方式为UTF-8 无BOM的编码方式。 

 
 

最新文章

  1. 批处理bat 命令
  2. CSS中浏览器开发商特定的CSS属性
  3. xcode 插件
  4. JsonModelStrategy策略添加
  5. 中文系统下,UTF-8编码文本文件读取导致的错误
  6. xml和xsl配合使用实例
  7. execute、executeUpdate、executeQuery三者的区别(及返回值)
  8. 基于mAppWidget实现手绘地图(十五)–如何控制放大缩小
  9. 关于内层DIV设置margin-top不起作用的解决方案
  10. 2.MyBatis有代理增删改
  11. c#多线程同步之Semaphore
  12. hibernate中怎样配置两个联合属性为唯一约束(非联合主键)
  13. [转]Javascript中几种较为流行的继承方式
  14. Hibernate入门(十二)离线条件检索
  15. JAVA中关于对像的读写
  16. 反射实现Model修改前后的内容对比
  17. 针对系统中磁盘IO负载过高的指导性操作
  18. JavaScript ES6中export及export default的区别以及import的用法
  19. day12 python学习 装饰器
  20. js、C#获取当前url的参数值

热门文章

  1. CVPapers - Computer Vision Resource
  2. C#实现多线程的方式:Task——任务
  3. 44.python排序算法(冒泡+选择)
  4. HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】
  5. B8 Concurrent JDK中的乐观锁与原子类
  6. 大数据学习笔记【一】:Hadoop-3.1.2完全分布式环境搭建(Windows 10)
  7. DB2创建EMP和DEPT并进行基础操作
  8. linux安装java jdk
  9. Oulipo POJ - 3461(kmp,求重叠匹配个数)
  10. UVA Tress in a Wood