环境要求:
- jdk1.8
- zookeeper
- solr5.5
- tomcat8
如图
首先,安装jdk1.8.这里就不显示出来。
zookeeper安装(集群)
- 解压zookeeper-3.4.9.tar.gz 压缩文件,并重命名解压后的文件夹,修改为zookeeper。文件如下:
- 在zookeeper 的文件夹下,新建data的空文件夹,用于保存数据
- 在zookeeper\conf 的文件夹下,找到zoo_sample.cfg,复制一份并重命名为zoo.cfg 修改里面的配置。
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
#http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
配置文件简单解析
1、tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
2、dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
3、dataLogDir:顾名思义就是 Zookeeper 保存日志文件的目录
4、clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
- 修改dataDir的路径为刚刚新建的data文件夹下。
- 进入bin文件夹下启动zkServer.cmd 可以看到启动成功。
- 集群:则复制zookeeper的文件夹复制三份,修该zoo.cfg文件。端口分别修改为2181,2182,2183, 然后添加如下内容:
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
然后分别在data文件夹添加文件 myid 内容分别对应1、2、3。
刚刚启动一个zookeeper会报错,正常。启动cmd控制端,输入telnet 127.0.0.1 2181 然后输入stat。如果出现如下:表示建立成功。
solr
- 解压solr-5.5.4.zip,将 solr-5.5.4\server\solr-webapp\webapp 文件夹底下的 webapp 复制到 tomcat 对应目录底下的 webapps 中,并将文件夹名字改为 solr
- 将 solr-5.5.4\server\lib\ext 文件夹底下的lib全部复制到tomcat底下的 solr/WEB-INF/lib/ 中
- 将solr-5.5.4\server\resources 下的log4j.properties文件复制到solr/WEB-INF/classes目录下,如果该目录不存在则新建classes。
- 在tomcat同一级的目录下新建solrhome文件夹,把将solr-solr-5.5.4\server 下的 solr 文件夹下内容复制到solrhome 目录下 , 这个就是 solrhome(存放的检索数据)
- 设置solrhome, 编辑 D:\tomcat\apache-tomcat-7.0.40\webapps\solr\WEB-INF\web.xml ;
solr 启动的时候会去这个目录下加载配置信息
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>F:\\solrcloud\\solrhome8080</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
修改env-entry-valued值:配置为solrhome的文件地址
- 启动tomcat(startup.bat),登入地址:http://127.0.0.1:8080/solr/index.html#/
7.则表示单机版的solr新建成功。
solr集群
- 复制tomcat文件,分别为tomcat8081、tomcat8082、tomcat8083
2.修改tomcat下的server.xml的
<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
让端口不会重复。
3.分别复制solrhome,复制三份。修改tomcat\webapps\solr\WEB-INF\web.xml下的solrhome,对应到各自的地址。
4.配置zookeeper和各个tomcat进行关联:首先确定leader节点,需要在server目录下(我的是apache-tomcat-8.5.5)的bin/catalina.bat中添加一行
set JAVA_OPTS=-Dbootstrap_confdir=E:\Tools\solr_home\core0\conf -Dcollection.configName=clusterconf -DzkRun -DzkHost=localhost:2181 -DnumShards=2
也可以用下面语句,把信息提交到zookeeper文件上管理。
java -classpath F:\solrcloud\tomcat8080\webapps\solr\WEB-INF\lib\* org.apache.solr.cloud.ZkCLI -cmd upconfig -zkhost 192.168.56.1:2181,192.168.56.1:2181,192.168.56.1:2181 -confdir F:\solrcloud\solrhome8080\configsets\basic_configs\conf\ -confname clusterconf
solr将文件同步到zookeeper集群中
5.指定其他三个为follower节点,在各自的server目录下的bin/catalina.bat中添加一行
set JAVA_OPTS=-DzkRun -DzkHost=localhost:2181 -DnumShards=2
6.分别修改solrhome/solr.xml,把port对应到各自tomcat下的端口。
7.启动tomcat。登入地址,则表示创建成功。
中文解析器
8.可以加入IKAnalyzer,这里用的是IKAnalyzer-5.0.jar,复制到tomcat底下的 solr/WEB-INF/lib/ 中,把IKAnalyzer.cfg.xml、mydict.dic、stopword.dic文件复制到solr/WEB-INF/classes目录下。
9.在F:\solrcloud\solrhome8080\configsets\basic_configs\conf找到managed-schema文件,添加如下代码:
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
同时可以添加需要索引的字段
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="long" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_updated" type="text_ik" indexed="true" stored="false" />
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_sell_point" dest="item_keywords"/>
然后,上传到zookeeper集群中。
java -classpath F:\solrcloud\tomcat8080\webapps\solr\WEB-INF\lib\* org.apache.solr.cloud.ZkCLI -cmd upconfig -zkhost 192.168.56.1:2181,192.168.56.1:2181,192.168.56.1:2181 -confdir F:\solrcloud\solrhome8080\configsets\basic_configs\conf\managed-schema -confname clusterconf
重新启动tomcat,如果看到如图内容,则表示成功。
spring结合
<!-- 集群版 -->
2 <bean id="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
3 <constructor-arg name="zkHost" value="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"></constructor-arg>
4 <property name="defaultCollection" value="collection2"></property>
5 </bean>
1 public class SolrCloudTest {
2
3 @Test
4 public void testAddDocument() throws Exception {
5 //创建一个和solr集群的连接
6 //参数就是zookeeper的地址列表,使用逗号分隔
7 String zkHost = "192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183";
8 CloudSolrServer solrServer = new CloudSolrServer(zkHost);
9 //设置默认的collection
10 solrServer.setDefaultCollection("collection2");
11 //创建一个文档对象
12 SolrInputDocument document = new SolrInputDocument();
13 //向文档中添加域
14 document.addField("id", "test001");
15 document.addField("item_title", "测试商品");
16 //把文档添加到索引库
17 solrServer.add(document);
18 //提交
19 solrServer.commit();
20 }
21
22 @Test
23 public void deleteDocument() throws SolrServerException, IOException {
24 //创建一个和solr集群的连接
25 //参数就是zookeeper的地址列表,使用逗号分隔
26 String zkHost = "192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183";
27 CloudSolrServer solrServer = new CloudSolrServer(zkHost);
28 //设置默认的collection
29 solrServer.setDefaultCollection("collection2");
30
31
32 solrServer.deleteByQuery("*:*");
33 solrServer.commit();
34 }
35 }