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;
}
}