一、 Solr在XML中的配置
<!-- 单机版solr服务配置 --> <bean id="builder" class="org.apache.solr.client.solrj.impl.HttpSolrClient.Builder"> <constructor-arg name="baseSolrUrl" value="http://192.168.25.120:8080/solr/coremain" /> </bean> <bean factory-bean="builder" factory-method="build" id="httpSolrClient"/>
<!-- 集群版solr服务 --> <bean id="empty_builder" class="org.apache.solr.client.solrj.impl.CloudSolrClient.Builder" /> <bean id="builder" factory-bean="empty_builder" factory-method="withZkHost"> <constructor-arg value="192.168.229.128:2181,192.168.229.128:2182,192.168.229.128:2183" type="java.lang.String" /> </bean> <bean id="cloudSolrClient" factory-bean="builder" factory-method="build"> <property name="defaultCollection" value="collection"></property> </bean>
二、所需要的jar包
<!--Solr客户端--> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>7.5.0</version> </dependency>
三、Solr集群的测试类
package XX.XXXXX.XXXXX; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.CloudSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrInputDocument; import org.junit.Test; import java.util.ArrayList; import java.util.List; import java.util.Optional; /** * @author Mr.Li * @version 1.0 * @Description: Solr集群测试 * @Modified By: * @date 2018/12/5 17:51 */ public class TestSolrCloud { //简单添加 @Test public void testAddDocument() throws Exception{ // 第一步:把solrJ相关的jar包添加到工程中。 // 第二步:创建一个SolrClient对象,需要使用CloudSolrServer子类。构造方法的参数是zookeeper的地址列表。 // 参数是zookeeper的地址列表 List<String> zkHost=new ArrayList<>(); zkHost.add("192.168.229.128:2181"); zkHost.add("192.168.229.128:2182"); zkHost.add("192.168.229.128:2183"); //builder的构造函数需要一个List和一个Optional Optional<String> zkChroot = Optional.of("/"); CloudSolrClient solrClient = new CloudSolrClient.Builder(zkHost,zkChroot) .withConnectionTimeout(10000) .withSocketTimeout(60000) .build(); // 第三步:需要设置DefaultCollection属性,里边的名字和自己创建的collection名字相同 solrClient.setDefaultCollection("collection"); // 第四步:创建一SolrInputDocument对象 SolrInputDocument document = new SolrInputDocument(); // 第五步:向文档对象中添加域 document.addField("id","solrcloud01"); document.addField("item_title", "测试商品01"); document.addField("item_price", 123); // 第六步:把文档对象写入索引库。 solrClient.add(document); // 第七步:提交。 solrClient.commit(); } //简单查询 @Test public void testQueryDocument() throws Exception{ // 第一步:把solrJ相关的jar包添加到工程中。 // 第二步:创建一个SolrClient对象,需要使用CloudSolrServer子类。构造方法的参数是zookeeper的地址列表。 // 参数是zookeeper的地址列表 List<String> zkHost=new ArrayList<>(); zkHost.add("192.168.229.128:2181"); zkHost.add("192.168.229.128:2182"); zkHost.add("192.168.229.128:2183"); //builder的构造函数需要一个List和一个Optional Optional<String> zkChroot=Optional.of("/"); CloudSolrClient solrClient=new CloudSolrClient.Builder(zkHost,zkChroot) .withConnectionTimeout(10000) .withSocketTimeout(60000) .build(); // 第三步:需要设置DefaultCollection属性,里边的名字和自己创建的collection名字相同 solrClient.setDefaultCollection("collection"); // 第四步:创建一个查询对象 SolrQuery query=new SolrQuery(); // 第五步:设置查询条件 query.setQuery("*:*"); // 第六步:执行查询 QueryResponse queryResponse = solrClient.query(query); // 第七步:取查询结果 SolrDocumentList solrDocumentList = queryResponse.getResults(); System.out.println("总记录数:" + solrDocumentList.getNumFound()); // 第八步:打印 for (SolrDocument solrDocument:solrDocumentList){ System.out.println(solrDocument.get("id")); System.out.println(solrDocument.get("title")); System.out.println(solrDocument.get("item_tile")); System.out.println(solrDocument.get("item_price")); } } }
四、集群的实现
package cn.e3mall.search.dao;
import cn.e3mall.common.pojo.SearchItem;
import cn.e3mall.common.pojo.SearchResult;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
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;
/**
* @author Mr.Li
* @version 1.0
* @Description: 商品搜索Dao
* @Modified By:
* @date 2018/12/5 0:14
*/
@Repository
public class SearchDao {
/**
* 在不使用spring进行配置solr的情况下可以这么写单机版的solr
* final String solrUrl="http://localhost:8080/solr/index.html#/new_core";
* HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl)
* .withConnectionTimeout(10000)
* .withSocketTimeout(60000)
* .build();
*/
/**
* @Autowired
* 在spring中进行了Solr单机版配置
* HttpSolrClient solrClient;
*/
/**
* 我们现在使用集群版
*/
@Autowired
CloudSolrClient solrClient;
/**
* 根据查询条件查询索引库
* @param query
* @return
*/
public SearchResult search(SolrQuery query) throws Exception{
//根据query查询索引库
QueryResponse queryResponse=solrClient.query(query);
//取查询结果
SolrDocumentList solrDocumentList = queryResponse.getResults();
//取查询结果总记录数
long numFound = solrDocumentList.getNumFound();
SearchResult searchResult=new SearchResult();
searchResult.setRecordCount(numFound);
//取商品列表,需要取高亮显示
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
List<SearchItem> itemList=new ArrayList<>();
for (SolrDocument solrDocument:solrDocumentList){
SearchItem item=new SearchItem();
item.setId((String) solrDocument.get("id"));
item.setCategory_name((String) solrDocument.get("item_category_name"));
item.setImage((String) solrDocument.get("item_image"));
item.setPrice((Long) solrDocument.get("item_price"));
item.setSell_point((String) solrDocument.get("item_sell_point"));
//取高亮显示
List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
String title = "";
if (list != null && list.size() > 0) {
title = list.get(0);
} else {
title = (String) solrDocument.get("item_title");
}
item.setTitle((String) solrDocument.get("item_title"));
//添加到上商品列表
itemList.add(item);
}
searchResult.setItemList(itemList);
//返回结果
return searchResult;
}
}