什么是SolrCloud:
SolrCloud(solr 云)是 Solr 提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud 的,当索引量很大,搜索请求并发很高,这时需要使用 SolrCloud 来满足这些需求。
SolrCloud 是基于 Solr 和 Zookeeper 的分布式搜索方案,它的主要思想是使用Zookeeper 作为集群的配置信息中心。
它有几个特色功能:
1)集中式的配置信息
2)自动容错
3)近实时搜索
4)查询时自动负载均衡
Solr集群结构图
Solr集群搭建设计:
安装Solr集群环境
需求:
1) 在192.168.70.147环境中安装zookeeper集群(已安装)
2) 创建4个tomcat实例,修改其端口为8080-8083
3) 使用已安装好的单机版solr作为集群的节点使用
创建solrcloud目录
mkdir solrcloud
安装Zookeeper集群
安装4个tomcat实例并将tomcat与索引库拷贝到solrCloud目录中
修改tomcat端口
修改solr服务中指向solr索引库的路径
创建集群
上传索引库配置文件
把 solrhome 中的配置文件上传到 zookeeper 集群。使用 zookeeper 的客户端上传
./zkcli.sh -zkhost 192.168.70.147:2181, 192.168.70.147:2182, 192.168.70.147:2183 -cmd upconfig -confdir /usr/local/solrcloud/solrhome1/solr/collection1/conf -confname myconf
修改solrhome下的solr.xml文件,指定当前实例运行的ip地址及端口号。
修改每一台solr的tomcat的bin目录下catalina.sh文件中加入DzkHost指定zookeeper服务器地址
JAVA_OPTS="-DzkHost=192.168.70.147:2181,192.168.70.147:2182,192.168.70.147:2183"
创建新的逻辑索引库并分片:
创建一个新的 collection,并分两片,每片是一主一备。
使用以下命令创建:
http://192.168.70.147:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
删除原来的逻辑索引库:
http://192.168.70.147:8080/solr/admin/collections?action=DELETE&name=collection1
测试SolrJ操作Solr集群:
在集群中添加文档
/**
* 向集群的索引库中添加文档
*/
public static void solrCloudInsert()throws Exception{
//zookeeper 地址
String zkHost = "192.168.70.147:2181,192.168.70.147:2182,192.168.70.147:2183";
//创建 solrCloud 对象
CloudSolrServer cloud = new CloudSolrServer(zkHost);
//给定索引库
cloud.setDefaultCollection("collection2");
//创建 solr 文档对象
SolrInputDocument docu = new SolrInputDocument();
docu.addField("id", "OldLu");
docu.addField("item_title", "老好了");
docu.addField("item_price",1000);
cloud.add(docu);
cloud.commit();
cloud.shutdown();
}
删除集群中的文档:
public static void solrClouddel() throws IOException, SolrServerException {
//zookeeper地址
String zook="192.168.181.126:2181,192.168.181.126:2182,192.168.181.126:2183";
//创建CloudSolrServer对象
CloudSolrServer css=new CloudSolrServer(zook);
//给定索引库
css.setDefaultCollection("collection2");
css.deleteByQuery("*:*");
//提交
css.commit();
//关闭
css.shutdown();
}
查询集群中的文档:
public static void solrCloudsel() throws IOException, SolrServerException {
//zookeeper地址
String zook="192.168.181.126:2181,192.168.181.126:2182,192.168.181.126:2183";
//创建CloudSolrServer对象
CloudSolrServer css=new CloudSolrServer(zook);
//给定索引库
css.setDefaultCollection("collection2");
SolrQuery sq=new SolrQuery();
sq.setQuery("nice");
sq.set("df","item_keywords");
sq.setStart(0);
sq.setRows(15);
QueryResponse query = css.query(sq);
SolrDocumentList resultsList = query.getResults();
System.out.println("总条数:"+resultsList.getNumFound());
for (SolrDocument sd:resultsList){
System.out.println(sd.get("item_title"));
System.out.println(sd.get("item_price"));
}
//提交
css.commit();
//关闭
css.shutdown();
}
Solr实战案例:
案例需求:
1) 使用技术springMVC+Spring+Mybatis+solrJ
2) 将mysql中的tb_item表中的部分业务数据导入到solr的索引库中
3) 提供一个搜索页面,在搜索页面中完成数据搜索
创建实战项目:
主要的service层和dao层:
com.bjsxt.service.impl.SearchItemServiceImpl:
package com.bjsxt.service.impl;
import com.bjsxt.dao.SolDao;
import com.bjsxt.pojo.PageResult;
import com.bjsxt.service.SearchItemService;
import org.apache.solr.client.solrj.SolrQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class SearchItemServiceImpl implements SearchItemService {
@Autowired
SolDao solDao;
@Override
public PageResult searchItem(String query, Integer page, Integer rows) throws Exception {
//创建查询条件
SolrQuery solrQuery=new SolrQuery();
//添加查询条件
solrQuery.setQuery(query);
//设置默认域
solrQuery.set("df","item_keywords");
//设置分页
solrQuery.setStart((page-1)*rows);
solrQuery.setRows(rows);
//设置高亮
solrQuery.setHighlight(true);
solrQuery.addHighlightField("item_title");
//设置高亮样式
solrQuery.setHighlightSimplePre("");
solrQuery.setHighlightSimplePost("");
//调用solDao
PageResult result = solDao.searchItem(solrQuery);
result.setPageIndex(page);
//总页数
Long total=result.getTotalNum()/rows;
if (result.getTotalNum()%rows>0){
total++;
}
result.setTotalPage(total);
return result;
}
}
com.bjsxt.service.impl.TbItemServiceImpl:
package com.bjsxt.service.impl;
import com.bjsxt.mapper.TbItemMapper;
import com.bjsxt.pojo.TbItem;
import com.bjsxt.service.TbItemService;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class TbItemServiceImpl implements TbItemService {
@Autowired
TbItemMapper mapper;
@Autowired
CloudSolrServer cloudSolrServer;
@Override
public void findall() {
try {
List list = mapper.findall();
List result=new ArrayList<>();
for (TbItem item:list ){
SolrInputDocument docu = new SolrInputDocument();
docu.setField("id", item.getId()+"");
docu.setField("item_title", item.getTitle());
docu.setField("item_sell_point", item.getSell_Point());
docu.setField("item_price", item.getPrice());
docu.setField("item_image", item.getImage());
result.add(docu);
}
cloudSolrServer.add(result);
cloudSolrServer.commit();
}catch (Exception e){
e.printStackTrace();
}
}
}
com.bjsxt.dao.impl.SolDaoImpl:
package com.bjsxt.dao.impl;
import com.bjsxt.dao.SolDao;
import com.bjsxt.pojo.PageResult;
import com.bjsxt.pojo.TbItem;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Repository
public class SolDaoImpl implements SolDao {
@Autowired
CloudSolrServer cloudSolrServer;
@Override
public PageResult searchItem(SolrQuery solrQuery) throws Exception {
QueryResponse res = cloudSolrServer.query(solrQuery);
SolrDocumentList list = res.getResults();
//处理结果集
PageResult pag=new PageResult();
//总条数
pag.setTotalNum(list.getNumFound());
List items=new ArrayList<>();
//获取高亮信息
Map>> hl=res.getHighlighting();
//模型转换
for (SolrDocument var:list){
TbItem item=new TbItem();
item.setId(Long.parseLong((String) var.get("id")));
item.setImage((String)var.get("item_image"));
item.setSell_Point((String)var.get("item_sell_point"));
item.setPrice((Long)var.get("item_price"));
List h = hl.get(var.get("id")).get("item_title");
String title="";
if (h!=null&&h.size()>0){
title=h.get((0));
}else {
title=(String)var.get("item_title");
}
item.setTitle(title);
items.add(item);
}
pag.setResult(items);
return pag;
}
}
parent的pom:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.bjsxt
parent
pom
1.0-SNAPSHOT
solrJDemo2
4.10.3
2.9.0
4.12
4.1.3.RELEASE
3.2.8
1.2.2
5.1.32
1.6.4
1.0.9
1.2
2.5
2.2
2.0
0.10
2.5.4
2.4.2
3.3
1.3.1
org.apache.solr
solr-solrj
${solrj.version}
redis.clients
jedis
${jedis.version}
junit
junit
${junit.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
${mybatis.spring.version}
mysql
mysql-connector-java
${mysql.version}
com.alibaba
druid
${druid.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-aspects
${spring.version}
jstl
jstl
${jstl.version}
javax.servlet
servlet-api
${servlet-api.version}
provided
javax.servlet
jsp-api
${jsp-api.version}
provided
commons-fileupload
commons-fileupload
${commons-fileupload.version}
commons-net
commons-net
${commons-net.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
src/main/java
**/*.xml
src/main/resources
**/*.xml
**/*.properties
org.apache.tomcat.maven
tomcat7-maven-plugin
${tomcat.version}
测试代码的pom:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
parent
com.bjsxt
1.0-SNAPSHOT
4.0.0
war
solrJDemo2
org.apache.solr
solr-solrj
junit
junit
org.slf4j
slf4j-log4j12
org.mybatis
mybatis
org.mybatis
mybatis-spring
mysql
mysql-connector-java
com.alibaba
druid
org.springframework
spring-context
org.springframework
spring-beans
org.springframework
spring-webmvc
org.springframework
spring-jdbc
org.springframework
spring-aspects
jstl
jstl
javax.servlet
servlet-api
provided
javax.servlet
jsp-api
provided
src/main/java
**/*.xml
src/main/resources
**/*.xml
**/*.properties
org.apache.tomcat.maven
tomcat7-maven-plugin
/
8080