专栏首页Java探索之路Solr在分布式环境中的应用

Solr在分布式环境中的应用

solr集群搭建

1、单机版运行正常 2、搭建zookeeper集群(最好也安装到solr集群目录下) 3、复制能够运行solr单机版的tomcat到solr集群目录下 4、修改tomcat端口号,使其能够运行 5、将 solrHome 中的 solrCore 拷贝一份,重新命名为 szxy(改名为以后的分片名) 6、拷贝四份solrhome到solr集群目录下,修改solrhome下每一个solr.xml的内容,使其地址指向这个solrhome所在地址 7、配置tomcat启动文件。catlina.sh

#第一个tomcat(写在开头即可,分别是zookeeper集群的ip+port,分片片名,总分骗术,总分组数)
JAVA_OPTS="-DzkHost=192.168.179.131:2181,192.168.179.131:2182,192.168.179.131:2183 -Dbootstrap_confdir=/usr/local/solrcloud/solrhome01/bjsxt/conf -Dcollection.configName=szxy-DnumShards=2 -DreplicationFactor=2"

#第二第三第四个tomctat
JAVA_OPTS="-DzkHost=192.168.179.131:2181,192.168.179.131:2182,192.168.179.131:2183 -DnumShards=2 -DreplicationFactor=2" 

8、分别修改 4 个 solrHome 中的 solr.xml, 依次对应 4 个 tomcat 的访问端口号 9、关闭防火墙,打开四个tomcat测试 。 访问地址: ip:tomcat端口号/solr

注: 1、 在安装solrhome后,在solrCore实例下,schema可以配置索引库的关键词字段 2、 data-config.xml可以配置数据库连接池,数据库和索引库文档的映射关系,数据库的列明和索引库的字段完成映射(导入数据库表到solr中)

solr在分布式项目中的应用

前提: 搭建一个mvc环境 步骤: 1、添加solr和zookeeper坐标 2、在application-dao.xml中添加实例化访问solr集群的api对象

 <!-- 实例化访问solr集群的api对象  -->
   <bean id="solrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
   		<constructor-arg name="zkHost" value="192.168.179.128:2181,192.168.179.128:2182,192.168.179.128:2183">
	</constructor-arg>
   </bean>

3、创建一个实体类,完成对索引库结果的封装,其中属性id等,为schema。xml中定义的关键字

package ah.szxy.search.entity;


import org.apache.solr.client.solrj.beans.Field;

/**
 * 完成对索引库结果的封装
 * 
 * @author chy
 *
 */
public class Item {

	@Field("id")
	private String id;
	@Field("title")
	private String title;
	@Field("sell_point")
	private String sell_point;
	@Field("price")
	private Long price;
	@Field("image")
	private String image;
	@Field("category_name")
	private String category_name;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getSell_point() {
		return sell_point;
	}

	public void setSell_point(String sell_point) {
		this.sell_point = sell_point;
	}

	public Long getPrice() {
		return price;
	}

	public void setPrice(Long price) {
		this.price = price;
	}

	public String getImage() {
		return image;
	}

	public void setImage(String image) {
		this.image = image;
	}

	public String getCategory_name() {
		return category_name;
	}

	public void setCategory_name(String category_name) {
		this.category_name = category_name;
	}
	
	/**
	 * 用于将获取到的image的url分开 ,然后封装成数组
	 * @return
	 */
	public String[] getImages() {
		String[] images = image.split(",");
		return images;
	}
}

4 . 在业务层实现类中对其进行查询

package ah.szxy.ego.search.service.impl;

import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import ah.szxy.ego.rpc.pojo.TbItem;
import ah.szxy.ego.rpc.service.ItemService;
import ah.szxy.ego.search.dao.ItemDao;
import ah.szxy.ego.search.service.SearchItemService;
import ah.szxy.search.entity.Item;
import ah.szxy.search.entity.SearchResult;

@Service
public class SearchItemServiceImpl implements SearchItemService {
	@Autowired
	private ItemDao itemDao;
	@Autowired
	private ItemService itemServiceProxy;
	
	@Override
	public SearchResult loadItemService(String item_keywords, Integer page) {
		SolrQuery params = new SolrQuery();

		// 设置默认查询字段
		params.set("df", "item_keywords");

		
		// 设置查询条件
		if (!StringUtils.isEmpty(item_keywords)) {
			params.setQuery(item_keywords);
		} else {
			params.set("q", "*:*");
		}

		// 指定分页参数
		Integer rows = 20;
		// 进行最小页判断
		if (page < 1) {
			page = 1;
		}
		// 进行最大页判断
		Integer maxpage = 100;
		if (page > maxpage) {
			page = maxpage;
		}
		Integer start = (page - 1) * rows;
		params.setStart(start);
		params.setRows(rows);

		// 设定高亮参数
		params.setHighlight(true);
		params.addHighlightField("title");
		params.setHighlightSimplePre("<font color='red'>");
		params.setHighlightSimplePost("</font>");
		// 调用dao方法,进行索引库查询
		QueryResponse response = itemDao.loadItem(params);

		// 获得本次查询到的文档集合
		SolrDocumentList docList = response.getResults();

		// 获得本次查询的高亮数据
		Map<String, Map<String, List<String>>> hlts = response.getHighlighting();

		// 获得本次查询到的总记录数
		long total = docList.getNumFound();

		// 创建List<Item>对象
		// List<Item> list=new ArrayList<>();

		// 将docList转化为List<Item>
		DocumentObjectBinder binder = new DocumentObjectBinder();
		List<Item> list = binder.getBeans(Item.class, docList);

		for (Item t : list) {
			String id = t.getId();
			// 获得某个商品信息的高亮数据
			Map<String, List<String>> map = hlts.get(id);
			// 获得某个商品的某个字段的高亮数据
			List<String> lts = map.get("title");
			if (lts != null && lts.size() > 0) {
				t.setTitle(lts.get(0));
			}
		}

		SearchResult result = new SearchResult();
		result.setMaxpage(Long.parseLong(String.valueOf(maxpage)));
		result.setTotal(total);
		result.setList(list);
		return result;
	}

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring全家桶之SpringBoot——初级阶段

    • Spring Boot 设计目的是用来简化新Spring 应用的初始搭建以及开发过程。 • 嵌入的Tomcat,无需部署WAR 文件 • Spring ...

    时间静止不是简史
  • Solr技术(附软件分享)

    Solr 版本:solr-4.10.3.tgz.tgz SolrLinux下的软件安装包以及中文分词器见末尾百度云1

    时间静止不是简史
  • HttpClient技术

    时间静止不是简史
  • 大厨小鲜——基于Netty自己动手编写RPC框架

    今天我们要来做一道小菜,这道菜就是RPC通讯框架。它使用netty作为原料,fastjson序列化工具作为调料,来实现一个极简的多线程RPC服务框架。

    老钱
  • Flink异步之矛-锋利的Async I/O

    在Flink 流处理过程中,经常需要和外部系统进行交互,用维度表补全事实表中的字段。

    暴走大数据
  • Flink异步之矛-锋利的Async I/O

    在Flink 流处理过程中,经常需要和外部系统进行交互,用维度表补全事实表中的字段。

    王知无
  • jdbc操作根据bean类自动组装sql,天啦,我感觉我实现了hibernate

    场景:需要将从ODPS数仓中计算得到的大额可疑交易信息导入到业务系统的mysql中供业务系统审核。但是本系统是开放是为了产品化,要保证不同环境的可移植性,同时同...

    intsmaze-刘洋
  • Java8实战——通过行为参数化传递代码 顶

    须臾之余
  • Java8——行为参数化传递代码

    AlbertZhang
  • Dart学习笔记(三)

    getUserInfo是自定义的函数,name和age是函数的参数,这两个参数都是必填,不然在调用的时候会报错。那么如何添加可选参数呢?如下:

    拉维

扫码关注云+社区

领取腾讯云代金券