solr相关,(目录
solr服务的搭建
第一步:安装jdk、安装tomcat
第二步:解压solr压缩包。(目录结构说明:contrib:扩展包;
bin:启动solr的命令;dist:源码,
目标文件<solr服务器war包,jar包,solrj相关>;
example:solr即为solrhome,scripts搭建集群需要使用到)
第三步:把dist/solr-4.10.3.war部署到tomcat下。
第四步:解压缩war包。启动tomcat解压。
第五步:需要把/root/solr-4.10.3/example/lib/ext目录下的所有的jar
包添加到solr工程中。
第六步:创建solrhome。把/root/solr-4.10.3/example/solr文件夹
复制一份作为solrhome。
第七步:告诉solr服务solrhome的位置。需要修改web.xml
第八步:启动tomcat。
配置中文分析器,自定义业务域
分析器使用IKAnalyzer。
使用方法:
第一步:把IKAnalyzer依赖的jar包添加到solr工程中。把分析器使用的扩展词典添加到classpath中。
第二步:需要自定义一个FieldType。Schema.xml中定义。可以在FieldType中指定中文分析器。
<fieldType name="text_ik" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> |
第三步:自定义域。指定域的类型为自定义的FieldType。
Sql语句:
SELECT
a.id,
a.title,
a.sell_point,
a.price,
a.image,
b.`name` category_name,
c.item_desc
FROM
tb_item a
LEFT JOIN tb_item_cat b ON a.cid = b.id
LEFT JOIN tb_item_desc c ON a.id = c.item_id
WHERE
a.`status` = 1
<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_category_name" type="string" indexed="true" stored="true" /> <field name="item_desc" 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"/> <copyField source="item_category_name" dest="item_keywords"/> <copyField source="item_desc" dest="item_keywords"/> |
第四步:重新启动tomcat
索引库中导入数据
solrj的使用
public class SolrJTest { @Test public void testSolrJ() throws Exception { //创建连接 SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr"); //创建一个文档对象 SolrInputDocument document = new SolrInputDocument(); //添加域 document.addField("id", "solrtest01"); document.addField("item_title", "测试商品"); document.addField("item_sell_point", "卖点"); //添加到索引库 solrServer.add(document); //提交 solrServer.commit(); }
@Test public void testQuery() throws Exception { //创建连接 SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr"); //创建一个查询对象 SolrQuery query = new SolrQuery(); query.setQuery("*:*"); //执行查询 QueryResponse response = solrServer.query(query); //取查询结果 SolrDocumentList solrDocumentList = response.getResults(); for (SolrDocument solrDocument : solrDocumentList) { System.out.println(solrDocument.get("id")); System.out.println(solrDocument.get("item_title")); System.out.println(solrDocument.get("item_sell_point")); } } } |
solr集群
solr集群的架构
SolrCloud
需要用到solr+zookeeper
要完成的集群结构
zookeeper
1、集群管理
主从的管理、负载均衡、高可用的管理。集群的入口。Zookeeper必须是集群才能保证高可用。Zookeeper有选举和投票的机制。集群中至少应该有三个节点。
2、配置文件的集中管理
搭建solr集群时,需要把Solr的配置文件上传zookeeper,让zookeeper统一管理。每个节点都到zookeeper上取配置文件。
3、分布式锁
4、忘了
集群需要的服务器
Zookeeper:3台
Solr:4台
伪分布式,zookeeper三个实例、tomcat(solr)需要四个实例。
Zookeeper需要安装jdk。
集群搭建步骤
第一部分:Zookeeper集群搭建
第一步:需要把zookeeper的安装包上传到服务器。
第二步:把zookeeper解压。
第三步:把zookeeper向/usr/local/solr-cloud目录下复制三份。
第三步:配置zookeeper。
1、在zookeeper01目录下创建一个data文件夹。
2、在data目录下创建一个myid的文件
3、Myid的内容为1(02对应“2”,03对应“3”)
4、Zookeeper02、03以此类推。
5、进入conf文件,把zoo_sample.cfg文件改名为zoo.cfg
6、修改zoo.cfg,把dataDir=属性指定为刚创建的data文件夹。
7、修改zoo.cfg,把clientPort指定为不冲突的端口号(01:2181、02:2182、03:2183)
8、在zoo.cfg中添加如下内容:
server.1=192.168.25.154:2881:3881
server.2=192.168.25.154:2882:3882
server.3=192.168.25.154:2883:3883
第四步:启动zookeeper。
Zookeeper的目录下有一个bin目录。使用zkServer.sh启动zookeeper服务。
启动:./zkServer.sh start
关闭:./zkServer.sh stop
查看服务状态:./zkServer.sh status
第二部分:搭建solr集群
第一步:安装四个tomcat,修改其端口号不能冲突。8080~8083
第二步:向tomcat下部署solr。把单机版的solr工程复制到tomcat下即可。
第三步:为每个solr实例创建一solrhome。
第四步:为每个solr实例关联对应的solrhome。修改web.xml
第五步:修改每个solrhome下的solr.xml文件。修改host、hostPort两个属性。分别是对应的ip及端口号。
第六步:把配置文件上传到zookeeper。需要使用
/root/solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh命令上传配置文件。
把/usr/local/solr-cloud/solrhome01/collection1/conf目录上传到zookeeper。
需要zookeeper集群已经启动。
./zkcli.sh -zkhost 192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183 -cmd upconfig -confdir /usr/local/solr-cloud/solrhome01/collection1/conf -confname myconf |
第七步:查看是否上传成功。
使用zookeeper的zkCli.sh命令。
第八步:告诉solr实例zookeeper的位置。需要修改tomcat的catalina.sh添加
JAVA_OPTS="-DzkHost=192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"
每个节点都需要添加。
第九步:启动每个solr实例。
第十步:集群分片。
将集群分为两片,每片两个副本。
http://192.168.25.154:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
第十一步:删除不用collection1
http://192.168.25.154:8080/solr/admin/collections?action=DELETE&name=collection1
ZkCli.sh连接zookeeper服务端之后进行的各种操作
使用如下命令连接zookeeper服务器 ./zkCli.sh -server 127.0.0.1:2184
1.创建(使用create命令,可以创建一个zookeeper节点)
create [-s] [-e] path data acl
其中,-s或-e分别制定节点特性:顺序或临时节点。默认情况下,即不添加-s或-e参数的,创建的是持久节点。
create /zk-book 123
执行完上面的命令,就在zookeeper的根节点下创建了一个叫做/zk-book的节点,并且节点的数据内容是“123”。另外,create命令的最后一个参数是acl,它是用来进行权限控制的,缺省情况下,不做任何权限控制。
2.读取
ls:使用ls命令,可以列出zookeeper指定节点下的所有子节点。当前,这个命令只能看到指定节点下第一级的所有子节点。用法如下:
ls path [watch]
其中,path表示的是指定数据节点的节点路径。
3.get
使用get命令,可以获取zookeeper指定节点的数据内容和属性信息。用法如下:
get path [watch]
4.更新
使用set命令,可以更新指定节点的数据内容。用法如下:
set path data [version]
其中,data就是要更新的新内容。注意,set命令后面还有一个version参数,在zookeeper中,节点的数据是有版本概念的,这个参数用于指定本次更新操作是基于ZNode的哪一个数据版本进行的。
5.删除
使用delete命令,可以删除zookeeper上的指定节点。用法如下:
delete path [version]
此命令中的version参数和set命令中的version参数的作用是一致的。要删除的节点必须没有子节点。
Zookeeper的典型应用场景与实现:
1.数据发布与订阅(发布和订阅系统通常有两种模式,分别是推push和拉pull方式,Zookeeper采用的是这两种方式的结合),通常由如下几步操作完成发布和订阅,①配置存储,②配置获取③配置变更
2.负载均衡(软件负载和硬件负载),可以参考动态的DNS服务。
3.命名服务(可以生产全局Id)
4.分布式协调/通知(Mysql数据复制总线。传统的分布式系统机器之间的通信方式:心跳检测,工作进度汇报,系统调度,这三种都可以通过现在的ZooKeeper来实现)
5.集群管理(集群监控和集群控制)
6.Master选举
7.分布式锁
8.分布式队列
Stat对象状态属性说明:
czxid:即Created ZXID,表示该数据节点被创建时的事务ID
mzxid:即Modified ZXID,表示该节点最后一次被更新时的事务ID
ctime:即Created Time,表示节点被创建的时间
mtime:即Modified Time,表示该节点最后一次被更新的时间
version:数据节点的版本号。
aversion:节点的ACL版本号。
ephemeralOwner:创建该临时节点的会话的sessionID。如果该节点是持久节点,那个这个属性值为0。
dataLength:数据内容的长度。
numChildren:当前节点的子节点个数。
pzxid:表示该节点的子节点列表最后一次被修改时的事务ID。注意,只有子节点列表变更了才会变更pzxid,子节点内容变更不会影响pzxid。
Watcher接口:标准的事件处理器,其定义了事件通知的相关逻辑,包含KeeperState和EventType两个枚举类,分别代表了通知状态和事件类型,同时定义了事件回调方法,process(WatchedEvent event)。
Watcher特性总结:
一次性;客户端串行执行(客户端Watcher回调的过程是一个串行同步的过程);轻量。
使用solrj连接集群
@Test public void testSolrClout() throws Exception { //创建一个SolrServer对象 CloudSolrServer solrServer = new CloudSolrServer("192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"); //设置默认的collection solrServer.setDefaultCollection("collection2"); //创建一个文档对象 SolrInputDocument document = new SolrInputDocument(); document.addField("id", "test01"); document.addField("item_title", "title1"); //添加文档 solrServer.add(document); //提交 solrServer.commit();
} |