前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Solr在分布式环境中的应用

Solr在分布式环境中的应用

作者头像
时间静止不是简史
发布2020-07-24 17:08:28
8450
发布2020-07-24 17:08:28
举报
文章被收录于专栏:Java探索之路Java探索之路

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

代码语言:javascript
复制
#第一个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对象

代码语言:javascript
复制
 <!-- 实例化访问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中定义的关键字

代码语言:javascript
复制
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 . 在业务层实现类中对其进行查询

代码语言:javascript
复制
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;
	}

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • solr集群搭建
  • solr在分布式项目中的应用
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档