mysql集群 solr_solr集群与项目实战

什么是SolrCloud:

SolrCloud(solr 云)是 Solr 提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud 的,当索引量很大,搜索请求并发很高,这时需要使用 SolrCloud 来满足这些需求。

SolrCloud 是基于 Solr 和 Zookeeper 的分布式搜索方案,它的主要思想是使用Zookeeper 作为集群的配置信息中心。

它有几个特色功能:

1)集中式的配置信息

2)自动容错

3)近实时搜索

4)查询时自动负载均衡

Solr集群结构图

8005305d2b9f86e3124d6a1af9b81cef.png

Solr集群搭建设计:

80ef842f8c9a3760e2fedb141c182f9a.png

安装Solr集群环境

需求:

1) 在192.168.70.147环境中安装zookeeper集群(已安装)

2) 创建4个tomcat实例,修改其端口为8080-8083

3) 使用已安装好的单机版solr作为集群的节点使用

创建solrcloud目录

mkdir solrcloud

安装Zookeeper集群

安装4个tomcat实例并将tomcat与索引库拷贝到solrCloud目录中

41a73a653f9fd5733f28bd1503e7228c.png

修改tomcat端口

修改solr服务中指向solr索引库的路径

创建集群

上传索引库配置文件

把 solrhome 中的配置文件上传到 zookeeper 集群。使用 zookeeper 的客户端上传

fb7a50cc00b5fd28423a1e5bd8d61ee1.png

./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

cf0403a4ab8fa66e827d577fdaedceb9.png

修改solrhome下的solr.xml文件,指定当前实例运行的ip地址及端口号。

36ebef5a6d04264bd5be9c55c40f9e90.png

修改每一台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"

e2ce8c12f33fe5956017d91806f8611f.png

创建新的逻辑索引库并分片:

创建一个新的 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

fea774aa0adfdab15b7cac0fdd307008.png

测试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) 提供一个搜索页面,在搜索页面中完成数据搜索

创建实战项目:

d1601d6f5cd9ff490d20053934b34f67.png

主要的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值