准备:solr 6.5、tomcat8、jdk1.8、zookeeper3.4.6 注:这里是以伪集群方式搭建,即在同一个机器上面部署三个solr节点,组成cloud, 环境是MacOSX , 其它系
准备:solr 6.5、tomcat8、jdk1.8、zookeeper3.4.6
注:这里是以伪集群方式搭建,即在同一个机器上面部署三个solr节点,组成cloud, 环境是MacOSX , 其它系统操作步骤差不多,这里的当前目录是/Users/vincent/dev/solrcloud
1> . 前置条件, 装好jdk8环境,解压一个tomcat8,并指定上UTF-8编码,方便后面做模板.
2> . 搭建zookeeper集群:
这里不介绍怎么搭建,非常简单,搭建完记得测试验证,确保没有问题。zookeeper伪集群搭建如下:
localhost:2281,localhost:2381,localhost:2481
3> . 搭建solrcloud
Tomcat8部署:
分别为tomcat1 , tomcat2 , tomcat3 , 对应端口分别为:8081、8082、8083 ,部署三份时一定注意修改端口,不要冲突
创建solr数据存储目录:
分别为solr_home_1、solr_home_2、solr_home_3 ;
将solr-6.5.1/server/solr下的solr.xml与zoo.cfg分别拷到solr_hom1、solr_home_2、solr_home3当中;
将solr_home_1/solr.xml将里面的端口改为8081 ;
将solr_home_2/solr.xml将里面的端口改为8082 ;
将solr_home_3/solr.xml将里面的端口改为8083;
部署solr节点服务:
将solr-6.5.0/server/solr-webapp中的web分别拷到tomcat1、tomcat2、tomcat3的webapp下,并将web名字修改为solr;
将solr-6.5.0/server/lib/ext下所有jar包分别拷到tomcat1、tomcat2、tomcat3下面webapps的solr项目的lib目录中;
将solr-6.5.0/server/lib下metrics-相关的jar包分别拷到tomcat1、tomcat2、tomcat3下面webapps的solr项目的lib目录中;
将solr-6.5.0/server/resources 下log4j.properties分别拷到tomcat1、tomcat2、tomcat3下面webapps的solr项目下的classes文件夹中,classes得创建;
修改tomcat1、tomcat2、tomcat3当中webapps/solr/WEB-INF/classes/log4j.properties文件,修改solr.log参数:
tomcat1 : solr.log=/Users/vincent/dev/solrcloud/tomcat1/logs
tomcat2: solr.log=/Users/vincent/dev/solrcloud/tomcat2/logs
tomcat3: solr.log=/Users/vincent/dev/solrcloud/tomcat3/logs
配置web.xml指定solrhome的位置:
打开三个tomcat下的solr的web.xml,将下图中的部分去掉注释,并将自己的solrhome地址加到配置文件中,分别对应的是上面创建solr_home_1、solr_home_2、solr_home_3。
解决访问solr报403的错误,分别修改三个tomcat当中solr项目中的web.xml,将169行左右的security-constraint代码注释掉
若出现404错误,连接地址改为localhost:8080/solr/index.html试试
4>. 创建集群配置文件目录
创建config-files目录
将 solr-6.0.0/server/solr/configsets/data_driven_schema_configs/conf目录下的所有文件拷贝到 /Users/vincent/dev/solrcloud/config-files下
将 solr-6.0/solr-6.0.0/example/example-DIH/solr/db/conf下的admin-extra.html, admin-extra.menu-bottom.html ,admin-extra.menu-top.html三个文件也复制到/Users/vincent/dev/solrcloud/config-files下
将 solr-6.0/solr-6.0.0/dist下的solr-dataimporthandler-6.0.0.jar和solr-dataimporthandler-extras-6.0.0.jar都复制到tomcat1、tomcat2、tomcat3的webapps/solr/WEB-INF/lib/下
将mysql驱动包复制到tomcat1、tomcat2、tomcat3的webapps/solr/WEB-INF/lib/下,用于后面数据库数据导入solr , 如果是其它数据库,则拷对应驱动包
5>. 配置分词器
solr自带中文分词:
复制solr-6.5.0/contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-6.5.0.jar到tomcat1、tomcat2、tomcat3的webapps/solr/WEB-INF/lib/下
编辑/Users/vincent/dev/solrcloud/config-files/managed-schema ,在</schema>前添加以下内容:
<!-- solr默认中文分词 -->
<fieldType name="text_smartcn" class="solr.TextField" positionIncrementGap="0">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
</fieldType>
ikanalyzer分词:
先准备ik jar包及字典文件:ext.dic IKAnalyzer.cfg.xml solr-analyzer-ik-5.1.0.jar ik-analyzer-solr5-5.x.jar stopword.dic
ext.dic为扩展字典,stopword.dic为停止词字典,IKAnalyzer.cfg.xml为配置文件,solr-analyzer-ik-5.1.0.jar ik-analyzer-solr5-5.x.jar为分词jar包。
将文件夹下的IKAnalyzer.cfg.xml , ext.dic和stopword.dic 三个文件 复制到tomcat1、tomcat2、tomcat3的/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>
复制solr-analyzer-ik-5.1.0.jar ik-analyzer-solr5-5.x.jar到tomcat1、tomcat2、tomcat3的webapps/solr/WEB-INF/lib/下
编辑/Users/vincent/dev/solrcloud/config-files/managed-schema ,在</schema>前添加以下内容:
<!-- 我添加的IK分词 -->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
</analyzer>
</fieldType>
拼英分词:
前期准备,需要用到pinyin4j-2.5.0.jar、pinyinAnalyzer.jar这两个jar包
将pinyin4j-2.5.0.jar、pinyinAnalyzer.jar这两个jar到tomcat1、tomcat2、tomcat3的webapps/solr/WEB-INF/lib/下
编辑/Users/vincent/dev/solrcloud/config-files/managed-schema ,在</schema>前添加以下内容:
<fieldType name="text_pinyin" class="solr.TextField" positionIncrementGap="0">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory"/>
<filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />
<filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory"/>
<filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />
<filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />
</analyzer>
</fieldType>
6>. 配置集群
修改tomcat1/bin/catalina.sh文件, 找到CLASSPATH=关键字这一行,在其下面加入,注意,这里core名为xjh
JAVA_OPTS="$JAVA_OPTS -Dbootstrap_confdir=/Users/vincent/dev/solrcloud/config-files -Dcollection.configName=xjh -DzkHost=localhost:2281,localhost:2381,localhost:2481"
修改tomcat2与tomcat3的bin/catalina.sh文件, 找到CLASSPATH=关键字这一行,在其下面加入
JAVA_OPTS="$JAVA_OPTS -DzkHost=localhost:2281,localhost:2381,localhost:2481"
7>. 测试难证
理论上按上面的步骤操作完,solrcloud6.5集群就搭建好了,分别访问测试验证下:
http://localhost:8081/solr/index.html
http://localhost:8082/solr/index.html
http://localhost:8083/solr/index.html
创建core, 3个solr节点,core名为xjh
http://localhost:8081/solr/admin/collections?action=CREATE&name=xjh&numShards=1&replicationFactor=3&maxShardsPerNode=3
8>. 创建core
示例:3个solr节点,core名为xjh
http://localhost:8081/solr/admin/collections?action=CREATE&name=xjh&numShards=1&replicationFactor=3&maxShardsPerNode=3
配置collection.示例如下:
创建接口:http://192.168.1.110:81/solr/admin/collections?action=CREATE&name=survey&numShards=2&replicationFactor=2&maxShardsPerNode=2
删除接口:http://localhost:81/solr/admin/collections?action=DELETE&name=survey
重新加载接口:http://localhost:8983/solr/admin/collections?action=RELOAD&name=survey
分割碎片接口:http://localhost:8983/solr/admin/collections?action=SPLITSHARD&collection=<collection_name>&shard=shardId
创建别名:http://localhost:8983/solr/admin/collections?action=CREATEALIAS&name=alias&collections=collection1,collection2,…
移除存在的别名:http://localhost:8983/solr/admin/collections?action=DELETEALIAS&name=alias
参数名说明
name:collection的名称
numShards:指定分片数量(slices)
replicationFactor:指定每个Shard副本数量
maxShardsPerNode:默认值为1,注意三个数值:numShards、replicationFactor、liveSolrNode,
一个正常的solrCloud集群不容许同一个liveSolrNode上部署同一个shard的多个replic,
因此当maxShardsPerNode=1时,numShards*replicationFactor>liveSolrNode时,报错。因此正确时因满足以下条件:
createNodeSet:如果不提供该参数,创建操作将创建碎片副本展开分布到所有活跃的 Solr 节点上。提供该参数改变用于创建碎片副本的节点集合
collection.configName:指定该collection使用那份config,这份config必须存在于zk中。
至此,集群搭建完毕
映射索引document对象关系:
编辑/Users/vincent/dev/solrcloud/config-files/managed-schema , 配置索引document对象映射关系:
找到“<schema name=”这一行,改为<schema name="xjh”
映射字段关系:注意id字段保留
<field name="goods_name" type="text_ik" indexed="false" stored="true"/>
<field name="brand_name" type="text_pinyin" indexed="false" stored="true" />
<field name="word" type="text_smartcn" indexed="false" stored="true"/>
<field name="gkey" type="text_smartcn" indexed="false" stored="true"/>
<!-- 定义一个字段来包含所有可搜索的字段 (通过copyField 实现) -->
<field name="keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
配置数据库导入数据:
前提:
在mysql当中创建一张go_item_t表,建表语句如下:
create table go_item_t(
item_id varchar(19) primary key not null,
goods_name varchar(500),
brand_name varchar(100),
word varchar(50),
gkey varchar(50)
);
添加一些数据到表里面,方便后面的测试
编辑 /Users/vincent/dev/solrcloud/config-files/solrconfig.xml文件,
在solrconfig.xml文件里<requestHandler name="/select" class="solr.SearchHandler"> 上面添加 配置
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
在 /Users/vincent/dev/solrcloud/config-files目录下创建data-config.xml , 内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/test"
user="root"
password="root"/>
<document>
<entity name="contract" query="select item_id,goods_name,brand_name,word,gkey from go_item_t ">
<field column = "item_id" name= "id" />
<field column = "goods_name" name = "goods_name" />
<field column = "brand_name" name = "brand_name" />
<field column = "word" name = "word" />
<field column = "gkey" name = "gkey" />
</entity>
</document>
</dataConfig>
访问solr节点1,选择core里面的Dataimport , 点击Execute , 如果不报错,应该就成功的将数据库当中的数据导入了solr
再query验证下,数据已进来