说明:使用root用户进行操作。

资源规划

组件 bigdata-node1 bigdata-node2 bigdata-node3
OS centos7.6 centos7.6 centos7.6
JDK jvm jvm jvm
Zookeeper QuorumPeerMain QuorumPeerMain QuorumPeerMain
MySQL N.A N.A MySQL Server
Solr solr-core/solrcloud solr-core/solrcloud solr-core/solrcloud

安装介质

版本:solr-7.7.2.tgz
下载:https://archive.apache.org/dist/lucene/solr
官网:http://lucene.apache.org/solr
GitHub:https://github.com/apache/lucene-solr

说明

Solr5以前版本,solr的启动都以Tomcat作为容器,从Solr5+之后版本,内部集成Jetty服务器,可以通过bin目录中相关脚本直接启动。

环境准备

安装JDK

参考:《 CentOS7.6-安装JDK-1.8.221

安装ZooKeeper

  1. 参考:《[CentOS7.6-安装ZooKeeper-3.4.10](https://www.yuque.com/polaris-docs/test/centos-setup-zookeeper)》

安装MySQL

参考:《CentOS7.6-安装MySQL-5.7.30

安装Solr

准备工作

  1. # 查看防火墙状态
  2. firewall-cmd --state
  3. # 停止firewall
  4. systemctl stop firewalld.service
  5. # 禁止firewall开机启动
  6. systemctl disable firewalld.service
  7. # 开放solr端口(未关闭防火墙状态下)
  8. firewall-cmd --zone=public --add-port=8983/tcp --permanent
  9. firewall-cmd --reload
  10. # 查看端口开放情况
  11. iptables -L -n
  12. # 安装lsof(列出当前系统打开文件的工具)
  13. yum -y install lsof
  14. # 设置系统文件打开数
  15. vi /etc/sysctl.conf
  16. fs.file-max = 6553560
  17. vi /etc/security/limits.conf
  18. * soft nproc 65535
  19. * hard nproc 65535
  20. * soft nofile 65535
  21. * hard nofile 65535

单机模式

解压缩

  1. cd /share
  2. wget https://archive.apache.org/dist/lucene/solr/7.7.2/solr-7.7.2.tgz
  3. tar -xvf solr-7.7.2.tgz -C /usr/local/
  4. rm solr-7.7.2.tgz

启动

  1. cd /usr/local/solr-7.7.2/bin
  2. ./solr start -force
  3. ./solr restart -force
  4. ./solr status
  5. ./solr stop -V

验证

  1. lsof -i:8983
  2. netstat -tlnp

WebUI:http://bigdata-node1:8983/solr
image.png

Solr Core操作

创建Solr Core

  • 方式1(控制台)

    1. cd /usr/local/solr-7.7.2/server/solr
    2. mkdir db_core
    3. cp -r configsets/_default/conf db_core/

    “Core Admin”>“Add Core”,如图:
    image.png

  • 方式2(命令行-推荐)

    1. cd /usr/local/solr-7.7.2/bin
    2. ./solr create_core -c db2_core -force
    3. ls /usr/local/solr-7.7.2/server/solr

    迁移

    1. # 示例:将LTSR008上的core迁移至本机
    2. cd /usr/local/solr-7.7.2/server/solr
    3. scp -r root@LTSR008:/usr/local/solr-7.7.2/server/solr/test_core .

    集群模式(SolrCloud)

    解压缩

    1. cd /share
    2. wget https://archive.apache.org/dist/lucene/solr/7.7.2/solr-7.7.2.tgz
    3. mkdir -p /home/vagrant/datas/solrcloud
    4. tar -xvf solr-7.7.2.tgz -C /home/vagrant/datas/solrcloud

    配置修改

    1. vi /home/vagrant/datas/solrcloud/solr-7.7.2/bin/solr.in.sh

    内容如下:

    1. ZK_HOST="192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181"
    2. ZK_CLIENT_TIMEOUT="15000"
    3. # 以下为推荐配置(可选)
    4. # SOLR_HOST="bigdata-node1"
    5. SOLR_WAIT_FOR_ZK="300"
    6. # 时区+8小时,东八区(北京时间)
    7. SOLR_TIMEZONE="UTC+8"

    分发

    1. scp -r /home/vagrant/datas/solrcloud root@bigdata-node2:/home/vagrant/datas/
    2. scp -r /home/vagrant/datas/solrcloud root@bigdata-node3:/home/vagrant/datas/

    启动

    1. # 所有节点执行(需要先确保zookeeper已启动)
    2. cd /home/vagrant/datas/solrcloud/solr-7.7.2/bin
    3. ./solr restart -cloud -force
    4. ./solr start -cloud -force
    5. # 指定端口
    6. ./solr start -cloud -p 8983 -force
    7. # 指定zk
    8. ./solr start -cloud -z 192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181 -p 8983 -force
    9. ./solr status
    10. ./solr stop -V

    WebUI:http://bigdata-node1:8983/solrhttp://bigdata-node2:8983/solrhttp://bigdata-node3:8983/solr

    config操作

  • 准备配置文件

    1. cd /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr
    2. mkdir db_cloud
    3. cp -r configsets/_default/conf db_cloud/
  • 上传配置到zk

    1. cd /home/vagrant/datas/solrcloud/solr-7.7.2/server/scripts/cloud-scripts
    2. ./zkcli.sh -zkhost 192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181 -cmd upconfig -confdir /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_cloud/conf -confname db_cloud

    image.png

  • 删除zk信息

    1. cd /home/vagrant/modules/zookeeper-3.4.10/bin
    2. bash zkCli.sh
    3. ls /configs
    4. rmr /configs/db_cloud

    collection操作

  • 创建collection

  1. 方式1(http)

    1. http://bigdata-node1:8983/solr/admin/collections?action=CREATE&name=db_cloud&numShards=3&replicationFactor=2&maxShardsPerNode=3&collection.configName=db_cloud

    image.png

  2. 方式2(命令行)

    1. # 命令行方式(会同时生成configs和collections子节点,而http方式不会生成configs子节点)
    2. cd /home/vagrant/datas/solrcloud/solr-7.7.2/bin
    3. ./solr create_collection -c test2 -shards 3 -replicationFactor 2 -n test2 -force

    image.png

  3. 方式3(控制台)

image.png

  • 重新加载collection

    1. http://bigdata-node1:8983/solr/admin/collections?action=RELOAD&name=test2
  • 删除collection

    1. http://bigdata-node1:8983/solr/admin/collections?action=DELETE&name=test2

    注意:此处不会清理zk和hdfs相关信息,需要自行清理。

    存储配置HDFS

    前提条件

    请确认Hadoop使用的是2.x以上版本,且hdfs-site.xml配置了如下内容:

    1. # bigdata-node1:vagrant
    2. export HADOOP_HOME=/home/vagrant/modules/hadoop-2.7.2
    3. vi ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml

    配置如下:

    1. <property>
    2. <name>dfs.webhdfs.enabled</name>
    3. <value>true</value>
    4. </property>
    5. <property>
    6. <name>dfs.permissions.enabled</name>
    7. <value>false</value>
    8. </property>

    分发:

    1. # vagrant用户
    2. cd ~/modules/hadoop-2.7.2/etc/hadoop/
    3. scp -r hdfs-site.xml vagrant@bigdata-node2:~/modules/hadoop-2.7.2/etc/hadoop/
    4. scp -r hdfs-site.xml vagrant@bigdata-node3:~/modules/hadoop-2.7.2/etc/hadoop/
    5. # 重启HDFS集群

    Solr支持将其索引和事务日志文件写入和读取到HDFS分布式文件系统,只需要通过简单地配置几个参数即可实现,Solr为我们提供了3种方式来实现。

    1. 启动Solr时设定

  • 单机模式

对于独立的Solr实例,应在启动Solr之前修改一些参数。可以在solrconfig.xml中设置它们,或者bin/solr在启动时将其传递给脚本。

  1. cd /home/vagrant/datas/solrcloud/solr-7.7.2
  2. bin/solr start -Dsolr.directoryFactory=HdfsDirectoryFactory \
  3. -Dsolr.lock.type=hdfs \
  4. -Dsolr.data.dir=hdfs://bigdata-node1:9000/solr \
  5. -Dsolr.updatelog=hdfs://bigdata-node1:9000/solr \
  6. -force
  • 集群模式

在SolrCloud模式下,最好保留数据并更新日志目录,这是Solr随附的默认值,而只需指定即可solr.hdfs.home。所有动态创建的集合都会在solr.hdfs.home根目录下自动创建适当的目录。

  1. cd /home/vagrant/datas/solrcloud/solr-7.7.2
  2. bin/solr start -c -Dsolr.directoryFactory=HdfsDirectoryFactory \
  3. -Dsolr.lock.type=hdfs \
  4. -Dsolr.hdfs.home=hdfs://bigdata-node1:9000/solr \
  5. -force

2. solr.in.sh文件中设定

solr.in.sh文件里面可以设定Solr的很多环境变量,所以我们也可以在这里面设定索引存放路径的相关配置:

  1. vi /home/vagrant/datas/solrcloud/solr-7.7.2/bin/solr.in.sh

内容如下:

  1. SOLR_OPTS="$SOLR_OPTS -Dsolr.directoryFactory=HdfsDirectoryFactory -Dsolr.lock.type=hdfs -Dsolr.hdfs.home=hdfs://bigdata-node1:9000/solr"

分发:

  1. scp -r /home/vagrant/datas/solrcloud/solr-7.7.2/bin/solr.in.sh root@bigdata-node2:/home/vagrant/datas/solrcloud/solr-7.7.2/bin/
  2. scp -r /home/vagrant/datas/solrcloud/solr-7.7.2/bin/solr.in.sh root@bigdata-node3:/home/vagrant/datas/solrcloud/solr-7.7.2/bin/

3. solrconfig.xml文件中设定

如果solr索引数据存放在hadoop hdfs中的话,创建的collection的solrconfig.xml文件要做3处改动:

  1. # 若配置文件是放在zk上的,则需要先从zk下载配置,修改完成后覆盖
  2. cd /home/vagrant/datas/solrcloud/solr-7.7.2/server/scripts/cloud-scripts
  3. ./zkcli.sh -zkhost 192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181 -cmd getfile /configs/db_cloud/solrconfig.xml solrconfig.xml
  4. vi solrconfig.xml
  • 修改第1处:

    1. <dataDir>${solr.data.dir:hdfs://bigdata-node1:9000/solr/db_cloud}</dataDir>
  • 修改第2处:

    1. <directoryFactory name="DirectoryFactory" class="solr.HdfsDirectoryFactory">
    2. <str name="solr.hdfs.home">hdfs://bigdata-node1:9000/solr</str>
    3. <str name="solr.hdfs.confdir">/home/vagrant/modules/hadoop-2.7.2/etc/hadoop</str>
    4. <str name="solr.lock.type">hdfs</str>
    5. </directoryFactory>
  • 修改第3处:

    1. <lockType>${solr.lock.type:hdfs}</lockType>

    solrconfig.xml中这三处默认值是:

    1. <dataDir>${solr.data.dir:}</dataDir>
    2. <directoryFactory name="DirectoryFactory"
    3. class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>
    4. <lockType>${solr.lock.type:native}</lockType>
  • 上传配置到ZooKeeper

    1. cd /home/vagrant/datas/solrcloud/solr-7.7.2/server/scripts/cloud-scripts
    2. ./zkcli.sh -zkhost 192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181 -cmd putfile /configs/db_cloud/solrconfig.xml solrconfig.xml

    测试

    1. http://bigdata-node1:8983/solr/admin/collections?action=CREATE&name=t111&numShards=3&replicationFactor=2&maxShardsPerNode=3&collection.configName=db_cloud
    2. http://bigdata-node1:8983/solr/admin/collections?action=RELOAD&name=db_cloud

    数据库同步数据

    1. 创建collection

    1. # 准备配置文件
    2. cd /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr
    3. mkdir db_sync
    4. cp -r configsets/_default/conf db_sync/
    5. # 上传配置
    6. cd /home/vagrant/datas/solrcloud/solr-7.7.2/server/scripts/cloud-scripts
    7. ./zkcli.sh -zkhost 192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181 -cmd upconfig -confdir /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf -confname db_sync
    8. # 创建collection
    9. http://bigdata-node1:8983/solr/admin/collections?action=CREATE&name=db_sync&numShards=1&replicationFactor=1&maxShardsPerNode=1&collection.configName=db_sync

    2. 创建data-config.xml

    1. cd /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf
    2. # 创建一个文件data-config.xml,与solrconfig.xml同级
    3. touch data-config.xml

    3. 修改solrconfig.xml

    1. vi /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf/solrconfig.xml

    在“”上方增加以下这段配置:

    1. <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    2.    <lst name="defaults">
    3.    <str name="config">data-config.xml</str>
    4.    </lst>
    5. </requestHandler>

    如果配置了HDFS存储需要配置如下内容:

    1. <!-- 修改 -->
    2. <dataDir>${solr.data.dir:hdfs://bigdata-node1:9000/solr/db_sync}</dataDir>
    3. <!-- 修改 -->
    4. <directoryFactory name="DirectoryFactory" class="solr.HdfsDirectoryFactory">
    5. <str name="solr.hdfs.home">hdfs://bigdata-node1:9000/solr</str>
    6. <str name="solr.hdfs.confdir">/home/vagrant/modules/hadoop-2.7.2/etc/hadoop</str>
    7. <str name="solr.lock.type">hdfs</str>
    8. </directoryFactory>
    9. <!-- 修改 -->
    10. <lockType>${solr.lock.type:hdfs}</lockType>

    4. 配置data-config.xml

    1. vi /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf/data-config.xml

    配置如下:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <dataConfig>
    3. <dataSource name="source1" type="JdbcDataSource"
    4. driver="com.mysql.jdbc.Driver"
    5. url="jdbc:mysql://192.168.0.103:3306/eagle"
    6. user="root"
    7. password="123456"
    8. batchSize="-1" />
    9. <document>
    10. <entity name="user" dataSource="source1"
    11. query="SELECT id,rtxno,username,password,email,realname FROM ke_users">
    12. <field column='id' name='myid' />
    13. <field column='rtxno' name='rtxno' />
    14. <field column='username' name='username' />
    15. <field column='password' name='password' />
    16. <field column='email' name='email' />
    17. <field column='realname' name='realname' />
    18. </entity>
    19. </document>
    20. </dataConfig>

    配置说明:

  • dataSource:url是你要访问的数据库路径(host请使用IP)。user是用户名,password是你的数据库密码。

  • query:是一个sql语句,表示需要导入哪张表的哪些字段。然后<field>标签中的column属性是SQL语句中查询的字段,跟数据库中对应;name属性是你给它起的一个别名,应该是必须指定的。有多个查询字段就需要有多个<field>标签,每一个<field>标签对应一个字段。
  • document:配置数据库查询语句与managed_schema域的对应关系。目的是在core导入数据的时候,通过该配置信息链接到数据库,通过查询语句把数据查询出来,通过数据库字段与managed_schema域关联关系创建索引。

    5. 修改managed-schema

    1. vi /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf/managed-schema
    添加内容如下: ```xml

  1. **参数说明**:
  2. - **name**:是这个域的名称,在整个managed_schema文件里面需要唯一,不能重复,这里定义成跟数据库表字段的名称,方便使用。当然,也可以定义成其他名字。
  3. - **type**:是表示这个字段的类型是什么,string是字符串类型,int是整形数据类型,date是时间类型,相当于数据库里面的timestamp。(_**solr-8.x solr-7.x,****凡是基本数据类型都要加p**** ,如:pintplong**_
  4. - **indexed**:表示是否索引,索引的话就能查询到,否则,搜索的时候,不会出现。
  5. - **stored**:表示是否存储到索引库里面。
  6. - **required**:是否必须。
  7. - **multiValued**:是否多值,比如商品信息中,一个商品有多张图片,一个Field想存储多个值的话,必须将multiValued设置为true
  8. <a name="KS9et"></a>
  9. ### 6. 导入依赖jar包
  10. 需要依赖以下jar包(下载地址:[http://mvnrepository.com/](http://mvnrepository.com/)):
  11. ```bash
  12. cd /share
  13. wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar
  14. wget https://repo1.maven.org/maven2/org/apache/solr/solr-dataimporthandler/7.7.2/solr-dataimporthandler-7.7.2.jar
  15. wget https://repo1.maven.org/maven2/org/apache/solr/solr-dataimporthandler-extras/7.7.2/solr-dataimporthandler-extras-7.7.2.jar
  16. cp mysql-connector-java-5.1.47.jar /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/lib/
  17. cp solr-dataimporthandler-7.7.2.jar /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/lib/
  18. cp solr-dataimporthandler-extras-7.7.2.jar /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/lib/

分发:

  1. cd /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/lib
  2. scp -r mysql-connector-java-5.1.47.jar root@bigdata-node2:/home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/lib/
  3. scp -r mysql-connector-java-5.1.47.jar root@bigdata-node3:/home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/lib/
  4. scp -r solr-dataimporthandler-7.7.2.jar root@bigdata-node2:/home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/lib/
  5. scp -r solr-dataimporthandler-7.7.2.jar root@bigdata-node3:/home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/lib/
  6. scp -r solr-dataimporthandler-extras-7.7.2.jar root@bigdata-node2:/home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/lib/
  7. scp -r solr-dataimporthandler-extras-7.7.2.jar root@bigdata-node3:/home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/lib/

然后配置solrconfig.xml,引用上面的jar包。

  1. vi /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf/solrconfig.xml

配置如下:

  1. <lib dir="${solr.install.dir:../../../..}/dist/" regex="mysql-connector-java-.*\.jar" />
  2. <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />

7. 上传配置至zk

  1. cd /home/vagrant/datas/solrcloud/solr-7.7.2/server/scripts/cloud-scripts
  2. ./zkcli.sh -zkhost 192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181 -cmd upconfig -confdir /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf -confname db_sync

重启Solr集群:

  1. cd /home/vagrant/datas/solrcloud/solr-7.7.2/bin
  2. ./solr restart -cloud -force

8. 数据准备

  1. # bigdata-node3
  2. mysql -uroot -p123456

脚本如下:

  1. create database IF not EXISTS eagle;
  2. DROP TABLE IF EXISTS `ke_users`;
  3. CREATE TABLE `ke_users` (
  4. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  5. `rtxno` int(11) NOT NULL,
  6. `username` varchar(64) NOT NULL,
  7. `password` varchar(128) NOT NULL,
  8. `email` varchar(64) NOT NULL,
  9. `realname` varchar(128) NOT NULL,
  10. PRIMARY KEY (`id`)
  11. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
  12. INSERT INTO `ke_users` VALUES ('1', '1001', 'admin1', '123456', 'admin1@email.com', 'Administrator1');
  13. INSERT INTO `ke_users` VALUES ('2', '1002', 'admin2', '123456', 'admin2@email.com', 'Administrator2');
  14. INSERT INTO `ke_users` VALUES ('3', '1003', 'admin3', '123456', 'admin3@email.com', 'Administrator3');
  15. INSERT INTO `ke_users` VALUES ('4', '1004', 'admin4', '123456', 'admin4@email.com', 'Administrator4');
  16. INSERT INTO `ke_users` VALUES ('5', '1005', 'admin5', '123456', 'admin5@email.com', 'Administrator5');
  17. INSERT INTO `ke_users` VALUES ('6', '1006', 'admin6', '123456', 'admin6@email.com', 'Administrator6');
  18. INSERT INTO `ke_users` VALUES ('7', '1007', 'admin7', '123456', 'admin7@email.com', 'Administrator7');
  19. INSERT INTO `ke_users` VALUES ('8', '1008', 'admin8', '123456', 'admin8@email.com', 'Administrator8');
  20. INSERT INTO `ke_users` VALUES ('9', '1009', 'admin9', '123456', 'admin9@email.com', 'Administrator9');

9. 导入数据

进入Solr控制台,选择部署好的“db_sync”逻辑库,点击“Dataimport”,再选择“full-import”(全部导入),点击“Execute”,出现下面的页面,证明这张表的数据已经导入进来了。
image.png

中文分词

首先,Solr有自己基本的类型,string、int/pint、date、long/plong等等。对于string类型,比如在你的core/conf/manage-schema文件中,配置一个字段类型为string类型,如果查询符合“我是中国人”的数据,它就认为“我是中国人”是一个词语。但是如果你将该字段设置成了分词,即配置成了text_ik类型,就可能匹配“我”、“中国人”、“中国”、“中”、“人”带有这些字的该字段数据都可能被查询到。这就是分词带来的结果。具体要按照各自的业务来配置是否分词,分词对于大文本字段设置是合理的,但是对于小字段,设置分词是没必要的,甚至有相反的结果。比如你的某一个叫姓名的字段设置了分词,还不如设置string,查询时模糊匹配效果最好,(模糊匹配就是查询条件两边加上),当然也要看自己业务需求是什么。
*中文分词在solr里面是没有默认开启的,需要自己配置一个中文分词器。

目前可用的分词器有smartcn、IK、Jeasy、jieba、ictclas4j、庖丁。其实主要是两种,一种是基于中科院ICTCLAS的隐式马尔科夫HMM算法的中文分词器,如smartcn、ictclas4j,优点是分词准确度高,缺点是不能使用用户自定义词库;另一种是基于最大匹配的分词器,如IK、Jeasy、庖丁,优点是可以自定义词库,增加新词,缺点是分出来的垃圾词较多。各有优缺点。主流还是ik,可以扩展自己的词库,非常方便,加入一些热搜词,主题词,对于搜索而言,非常方便。

IK Analyzer简介

IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了 4 个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开始,IK发展为面向 Java的公用分词组件,独立于Lucene项目,同时提供了对 Lucene的默认优化实现。在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。

IK Analyzer下载

  1. wget https://search.maven.org/remotecontent?filepath=com/github/magese/ik-analyzer-solr7/7.x/ik-analyzer-solr7-7.x.jar
  2. wget https://repo1.maven.org/maven2/com/github/magese/ik-analyzer-solr7/7.x/ik-analyzer-solr7-7.x.jar
  3. wget http://files.cnblogs.com/files/zhangweizhong/ikanalyzer-solr5.zip
  4. # 百度网盘地址
  5. # https://pan.baidu.com/s/1smOxPhF (6.5)
  6. # 链接: https://pan.baidu.com/s/1eYF99KcqaT81weTUGFFFiQ 提取码: ezt8 (2012)
  7. https://code.google.com/archive/p/ik-analyzer/downloads
  8. # 7.x、8.x
  9. https://search.maven.org/search?q=com.github.magese
  10. https://github.com/magese/ik-analyzer-solr/releases

下载文件说明:

文件名 描述
ext.dic 自定义词 ,如:“沙雕”,在汉语里面不是一个词 ,它只是一个网络用语,可以配置让它成为一个词
stopword.dic 停止字典,如:“啊”、“吧”、“唉 ”等不作分词
IKAnalyzer.cfg.xml 配置ik的配置文件,不用改
*.jar ik分词依赖jar包,如:ik-analyzer-solr5-5.x.jar、solr-analyzer-ik-5.1.0.jar
ik.conf 动态加载扩展词字典表关键配置。
1. files为动态词典列表,可以设置多个词典表,用逗号进行分隔,默认动态词典表为dynamicdic.txt;
1. lastupdate默认值为0,每次对动态词典表修改后请+1,不然不会将词典表中新的词语添加到内存中。
dynamicdic.txt 动态加载扩展词字典表关键配置。
在此文件配置的词语不需重启服务即可加载进内存中。 以#开头的词语视为注释,将不会加载到内存中。

IKAnalyzer.cfg.xml配置文件说明:

名称 类型 描述 默认
use_main_dict boolean 是否使用默认主词典 true
ext_dict String 扩展词典文件名称,多个用分号隔开 ext.dic;
ext_stopwords String 停用词典文件名称,多个用分号隔开 stopword.dic;

IK Analyzer配置

以Solr-7.x为例,分词配置如下。

Maven仓库地址

  1. <!-- https://mvnrepository.com/artifact/com.github.magese/ik-analyzer -->
  2. <dependency>
  3. <groupId>com.github.magese</groupId>
  4. <artifactId>ik-analyzer</artifactId>
  5. <version>7.7.1</version>
  6. </dependency>

单机版Solr

参考:https://github.com/magese/ik-analyzer-solr/blob/v7.7.1/README.md

  1. 将jar包(如:ik-analyzer-solr-7.x.jar)放入Solr服务的Jetty或Tomcat的webapp/WEB-INF/lib/目录下;
  2. 将resources目录下的5个配置文件放入solr服务的Jetty或Tomcat的webapp/WEB-INF/classes/目录下;

    1. IKAnalyzer.cfg.xml
    2. ext.dic
    3. stopword.dic
    4. ik.conf
    5. dynamicdic.txt
  3. 配置Solr的managed-schema,添加ik分词器,示例如下;

    1. <!-- ik分词器 -->
    2. <fieldType name="text_ik" class="solr.TextField">
    3. <analyzer type="index">
    4. <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
    5. <filter class="solr.LowerCaseFilterFactory"/>
    6. </analyzer>
    7. <analyzer type="query">
    8. <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
    9. <filter class="solr.LowerCaseFilterFactory"/>
    10. </analyzer>
    11. </fieldType>
  4. ik.conf文件说明;

    1. files=dynamicdic.txt
    2. lastupdate=0

    Tips:

    1. files为动态词典列表,可以设置多个词典表,用逗号进行分隔,默认动态词典表为dynamicdic.txt;
    2. lastupdate默认值为0,每次对动态词典表修改后请+1,不然不会将词典表中新的词语添加到内存中。
  5. dynamicdic.txt为动态词典;
    在此文件配置的词语不需重启服务即可加载进内存中。 以#开头的词语视为注释,将不会加载到内存中。
  6. 自定义分词字段;

需要用ik分词的field type属性改成text_ik即可,例如:

  1. <field name="userName" type="text_ik" indexed="true" stored="true"/>
  1. 启动Solr服务测试分词;

image.png

  1. 扩展词

使用Ik的扩展配置在Solr目录下创建IKAnalyzer.cfg.xml,配置如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
  3. <properties>
  4. <comment>IK Analyzer 扩展配置</comment>
  5. <!--用户可以在这里配置自己的扩展字典 -->
  6. <entry key="ext_dict">ext.dic;my-ext.dic;</entry>
  7. <!--用户可以在这里配置自己的扩展停止词字典-->
  8. <entry key="ext_stopwords">stopword.dic;my-stopword.dic;</entry>
  9. </properties>

Tips:
my-ext.dic即为扩展分词库,分词库可以为多个,以分号隔开即可,停止词库一样。新增“my-ext.dic”和“my-stopword.dic”文件。文件格式必需是:无BOM的UTF-8格式。

集群版SolrCloud

参考:https://github.com/magese/ik-analyzer-solr/blob/v7.7.1/README-CLOUD.md
因为Solr-Cloud中的配置文件是交由zookeeper进行管理的, 所以为了方便更新动态词典, 所以也要将动态词典文件上传至zookeeper中,目录与solr的配置文件目录一致。
注意:因为zookeeper中的配置文件大小不能超过1m,当词典列表过多时,需将词典文件切分成多个。

  1. 将jar包(如:ik-analyzer-solr-7.x.jar)放入每台服务器的Solr服务的Jetty或Tomcat的webapp/WEB-INF/lib/目录下;

    1. cp /share/ik-analyzer-solr-7.x.jar /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/lib/
  2. 将resources目录下的IKAnalyzer.cfg.xml、ext.dic、stopword.dic放入solr服务的Jetty或Tomcat的webapp/WEB-INF/classes/目录下;

    1. IKAnalyzer.cfg.xml (IK默认的配置文件,用于配置自带的扩展词典及停用词典)
    2. ext.dic (默认的扩展词典)
    3. stopword.dic (默认的停词词典)
    1. mkdir -p /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/classes
    2. cp /share/IKAnalyzer.cfg.xml /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/classes/
    3. cp /share/ext.dic /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/classes/
    4. cp /share/stopword.dic /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/classes/

    注意:与单机版不同,ik.conf及dynamicdic.txt请不要放在classes目录下!

  3. 将resources目录下的ik.conf及dynamicdic.txt放入solr配置文件夹中,与solr的managed-schema文件同目录中;

    1. ik.conf (动态词典配置文件)
    2. files (动态词典列表,可以设置多个词典表,用逗号进行分隔,默认动态词典表为dynamicdic.txt)
    3. lastupdate (默认值为0,每次对动态词典表修改后请修改该值,必须大于上次的值,不然不会将词典表中新的词语添加到内存中。)
    4. dynamicdic.txt (默认的动态词典,在此文件配置的词语不需重启服务即可加载进内存中。以#开头的词语视为注释,将不会加载到内存中。)
    1. cp /share/ik.conf /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf/
    2. cp /share/dynamicdic.txt /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf/
  4. 配置Solr的managed-schema,添加ik分词器,示例如下;

    1. vi /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf/managed-schema

    配置如下:

    1. <!-- ik分词器 -->
    2. <fieldType name="text_ik" class="solr.TextField">
    3. <analyzer type="index">
    4. <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
    5. <filter class="solr.LowerCaseFilterFactory"/>
    6. </analyzer>
    7. <analyzer type="query">
    8. <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
    9. <filter class="solr.LowerCaseFilterFactory"/>
    10. </analyzer>
    11. </fieldType>
  5. 将配置文件上传至zookeeper中,首次使用请重启服务或reload Collection;

    1. cd /home/vagrant/datas/solrcloud/solr-7.7.2/server/scripts/cloud-scripts
    2. ./zkcli.sh -zkhost 192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181 -cmd upconfig -confdir /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf -confname db_sync
  6. 测试分词;

    扩展词动态加载(热更新)

    通过IK添加动态加载词典表功能,在不需要重启solr服务的情况下加载新增的词典。

分词工具 词库中词的数量 最后更新时间
ik 27.5万 2012年
mmseg 15.7万 2017年
word 64.2万 2014年
jieba 58.4万 2012年
jcesg 16.6万 2018年
sougou词库 115.2万 2019年

Tips:将以上词库进行整理后约187.1万条词汇。

单机版Solr

参考:https://www.freesion.com/article/1488136294

  1. 修改dynamicdic.txt,添加扩展词;

    1. vi /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/classes/dynamicdic.txt
  2. 修改ik.conf,更新版本(lastupdate+1,确保比之前的数组大即可);

    1. vi /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr-webapp/webapp/WEB-INF/classes/ik.conf
  3. 验证(无需重启,配置热加载);

    集群版SolrCloud

    参考:https://github.com/magese/ik-analyzer-solr/blob/v7.7.1/README-CLOUD.md

  4. 修改dynamicdic.txt,添加扩展词,并将配置上传至zk;

    1. # 示例
    2. cd /home/vagrant/datas/solrcloud/solr-7.7.2/server/scripts/cloud-scripts
    3. ./zkcli.sh -zkhost 192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181 -cmd getfile /configs/db_sync/dynamicdic.txt /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf/dynamicdic.txt
    4. vi /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf/dynamicdic.txt
    5. ./zkcli.sh -zkhost 192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181 -cmd putfile /configs/db_sync/dynamicdic.txt /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf/dynamicdic.txt
  5. 修改ik.conf,更新版本(lastupdate+1,确保比之前的数组大即可),并将配置上传至zk;

    1. # 示例
    2. cd /home/vagrant/datas/solrcloud/solr-7.7.2/server/scripts/cloud-scripts
    3. ./zkcli.sh -zkhost 192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181 -cmd getfile /configs/db_sync/ik.conf /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf/ik.conf
    4. vi /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf/ik.conf
    5. ./zkcli.sh -zkhost 192.168.0.101:2181,192.168.0.102:2181,192.168.0.103:2181 -cmd putfile /configs/db_sync/ik.conf /home/vagrant/datas/solrcloud/solr-7.7.2/server/solr/db_sync/conf/ik.conf
  6. 验证(无需重启,配置热加载);

    参考

    CSDN:Centos7上搭建solrcloud(solr7.3.1+内置jetty+zookeeper3.4.12)
    https://blog.csdn.net/wudinaniya/article/details/81180336
    CSDN:Centos7上安装solr7.3.1(用jetty部署-单机模式)
    https://blog.csdn.net/wudinaniya/article/details/81163931
    简书:CentOS7.3搭建solr7.2
    https://www.jianshu.com/p/43885d4de846
    OSCHINA:Centos7安装Solr7.2.1
    https://my.oschina.net/liangguoqiang/blog/1622396
    博客园:CentOS7搭建solr7.2
    https://www.cnblogs.com/nshgo/p/8670835.html
    CSDN:基于Centos7安装Solr7.4,并导入数据教程
    https://blog.csdn.net/u013160017/article/details/81037279