Lucene和Solr从数据库加载词库分析
中文比较常用的分词库主要IK,ansj和messeg,下面针对IK来做分析,其他的几种分词器,都是大同小异的原理。
(一)词库介绍
不论使用什么类型的分词器,一般都少不了使用词库,而词库里面,除了主词库之外,还有扩展词库,同义词库,禁用词库等,其中扩展词库,同义词库,禁用词库是比较基础的词库,一般类型的业务开发,使用这3种词库后,基本能满足需求,特殊情况需要另外考虑。
(二)词库需求
每一个网站都需要有一个特定行业的词库,来丰富词库系统,当然你可以不用建立词库,这样的效果可能检索的时候,用户体验可能会比较查,在系统运行过程中,词库是可以动态更新的,所以要求我们的分词器,能够动态更新所有的词库,比如禁用词,同义词,扩展词等,这样做动态性比较好,但已经建好索引的文本,与目前的词库可能会存在一些误差,这种差别会在下一次重建索引时得到改变,所谓词库的动态更新,也就是在后台单独起个线程定时在内存里重新Load词库
(三)为什么需要从数据库或缓存加载词库?
在实际的开发中,搜索作为一个重要的组件,很少单独部署作为一个应用,除非是那种比较小的数据量,或者对搜索要求不是非常严格,通常在互联网或者电子商务行业,特别是电商行业,因为访问量比较大,对系统并发,负载均衡,响应请求要求比较高,所以搜索作为一个关键的应用通常需要采用集群的方式来构建一个高可用,高扩展的检索系统,在集群中,一般采用主从架构的方式,这样以来1主N从,需要有很多份词库文件,如果词库经常变化那么这种牵一发而动全身的趋势,就会变的很明显,解决办法主要有2种:
(1)在配置主从同步架构时,把,变化的词库放在Master上,然后同步的时候把词库的配置文件也同步过去。
(2)第二种就是今天主题所说,所有的词库文件都从某一个集中的地方管理,然后各个solr节点,定时从数据库,或缓存里读取并更新(在IK源码的Dictionary里进行更新)。
第一种方式的弊端在于,仅仅在solr的主从架构时,采用这种,会比较方便,如果是solrcloud的模式,这种方法就不适用了
第二种方式相对来说比较方便,整个集群只维持一份词库文件,改用较小,而且更好的办法我们可以结合本地词库+数据库的方式一起工作,这样以来当数据库出现宕机的时候,我们的词库仍能正常工作。
(四)使用流程简析
1,由于我们加入了同义词,所以需要定义一个IK的同义词工厂类IKSynonymFilterFactory继承TokenFilterFactory类并实现ResourceLoaderAware接口和Runnable接口,并重写create方法,在solr的里使用
2,我们定义一个ISSAnalyer类继承Analyzer,并重写必要方法,方便在控制台下测试。
3,定义一个IKTokenizerFactory类继承TokenizerFactory并实现ResourceLoaderAware接口,并重写inform方法和create方法,在solr里配置使用。
- 浏览: 1052267 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1441)
- 软件思想&演讲 (9)
- 行业常识 (250)
- 时时疑问 (5)
- java/guava/python/php/ruby/R/scala/groovy (213)
- struct/spring/springmvc (37)
- mybatis/hibernate/JPA (10)
- mysql/oracle/sqlserver/db2/mongdb/redis/neo4j/GreenPlum/Teradata/hsqldb/Derby/sakila (268)
- js/jquery/jqueryUi/jqueryEaseyUI/extjs/angulrJs/react/es6/grunt/zepto/raphael (81)
- ZMQ/RabbitMQ/ActiveMQ/JMS/kafka (17)
- lucene/solr/nuth/elasticsearch/MG4J (167)
- html/css/ionic/nodejs/bootstrap (19)
- Linux/shell/centos (56)
- cvs/svn/git/sourceTree/gradle/ant/maven/mantis/docker/Kubernetes (26)
- sonatype nexus (1)
- tomcat/jetty/netty/jboss (9)
- 工具 (17)
- ETL/SPASS/MATLAB/RapidMiner/weka/kettle/DataX/Kylin (11)
- hadoop/spark/Hbase/Hive/pig/Zookeeper/HAWQ/cloudera/Impala/Oozie (190)
- ios/swift/android (9)
- 机器学习&算法&大数据 (18)
- Mesos是Apache下的开源分布式资源管理框架 (1)
- echarts/d3/highCharts/tableau (1)
- 行业技能图谱 (1)
- 大数据可视化 (2)
- tornado/ansible/twisted (2)
- Nagios/Cacti/Zabbix (0)
- eclipse/intellijIDEA/webstorm (5)
- cvs/svn/git/sourceTree/gradle/jira/bitbucket (4)
- jsp/jsf/flex/ZKoss (0)
- 测试技术 (2)
- splunk/flunm (2)
- 高并发/大数据量 (1)
- freemarker/vector/thymeleaf (1)
- docker/Kubernetes (2)
- dubbo/ESB/dubboX/wso2 (2)
最新评论
发表评论
-
elasticsearch异常信息汇总
2017-11-06 09:34 15461.IndexMissingException 异常信息 ... -
Elasticsearch的架构
2018-03-22 10:30 508为什么要学习架构? Elasticsearch的一些架构 ... -
怎么在Ubuntu上打开端口
2017-10-21 20:45 0Netstat -tln 命令是用来查看linux的端口使用情 ... -
Elasticsearch工作原理
2018-03-22 10:30 449一、关于搜索引擎 各 ... -
Elasticsearch的路由(Routing)特性
2017-10-11 10:41 0Elasticsearch路由机制介 ... -
Elasticsearch中的segment理解
2017-10-11 09:58 1886在Elasticsearch中, 需要搞清楚几个名词,如se ... -
Elasticsearch的路由(Routing)特性
2017-09-28 16:52 618Elasticsearch路由机制介绍 Elastics ... -
Elasticsearch 的 Shard 和 Segment
2017-09-28 16:05 1199Shard(分片) 一个Shard就是一个Lu ... -
开源大数据查询分析引擎现状
2017-09-22 03:04 831大数据查询分析是云计算中核心问题之一,自从Google在20 ... -
大数据处理方面的 7 个开源搜索引擎
2017-09-22 03:01 495大数据是一个包括一切 ... -
开源大数据查询分析引擎现状
2017-09-23 11:26 550大数据查询分析是云计算中核心问题之一,自从Google在2 ... -
elasticsearch 把很多类型都放在一个索引下面 会不会导致查询慢
2017-09-25 09:45 982主要看数据量ES索引优 ... -
腾讯大数据Hermes爱马仕的系统
2017-09-23 11:15 991腾讯大数据最近做了几件事,上线了一个官方网站http:// ... -
配置高性能Elasticsearch集群的9个小贴士
2017-09-25 10:02 591Loggly服务底层的很多 ... -
Elasticsearch与Solr
2017-09-25 16:24 550Elasticsearch简介* Elasti ... -
大数据杂谈微课堂|Elasticsearch 5.0新版本的特性与改进
2017-09-26 09:57 808Elastic将在今年秋季的 ... -
ElasticSearch性能优化策略
2017-09-26 09:51 448ElasticSearch性能优化主 ... -
ES索引优化
2017-09-19 20:39 0ES索引优化篇主要从两个方面解决问题,一是索引数据过程;二是 ... -
分词与索引的关系
2017-09-19 20:33 0分词与索引,是中文搜索里最重要的两个技术,而且两者间是密不可 ... -
Elasticsearch中的segment理解
2017-09-19 20:30 0在Elasticsearch中, 需要搞清楚几个名词,如se ...
相关推荐
1. **IK分词器**:IK分词器最初设计用于Lucene/Solr搜索引擎项目,能够有效地对中文文本进行分词。它的主要特点包括动态词典加载、支持自定义扩展词库、高性能以及支持多种分词模式。IK分词器提供了标准版和智能版,...
使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...
使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...
使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...
使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...
使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...
使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...
使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...
使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...
使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...
使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...
使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...
使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...
使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...