阶段一:相关链接
阶段二:整合配置
<dependencies>
<!-- Spring配置 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.19.RELEASE</version>
</dependency>
<!--Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<!--Spring Data Solr-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>1.5.5.RELEASE</version>
</dependency>
</dependencies>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:solr="http://www.springframework.org/schema/data/solr"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/data/solr http://www.springframework.org/schema/data/solr/spring-solr.xsd">
<bean id="solrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
<constructor-arg value="192.168.44.110:2181,192.168.44.111:2181,192.168.44.112:2181"/>
<property name="defaultCollection" value="collection1"/>
</bean>
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg ref="solrServer"/>
</bean>
</beans>
阶段三:Solr域配置
<!-- 配置域【普通搜索】 -->
<field name="emp_id" type="long" indexed="true" stored="true"/>
<field name="emp_userName" type="string" indexed="true" stored="true" />
<field name="emp_nickName" type="text_ik" indexed="true" stored="true"/>
<field name="emp_avatar" type="string" indexed="true" stored="true" />
<field name="emp_describe" type="text_ik" indexed="true" stored="true" />
<field name="emp_occupation" type="text_ik" indexed="true" stored="true" />
<field name="emp_salary" type="double" indexed="true" stored="true"/>
<field name="emp_updTime" type="date" indexed="true" stored="true"/>
<!-- 复制域【关键字】 -->
<field name="emp_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="emp_userName" dest="emp_keywords"/>
<copyField source="emp_nickName" dest="emp_keywords"/>
<copyField source="emp_describe" dest="emp_keywords"/>
<copyField source="emp_occupation" dest="emp_keywords"/>
<!-- 动态域【技能搜索】 -->
<dynamicField name="emp_skill_*" type="string" indexed="true" stored="true" />
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190924223156652.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE4NzczMA==,size_16,color_FFFFFF,t_70)
阶段四:SolrTemplate相关操作
package com.hf.solr.entity;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.solr.core.mapping.Dynamic;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;
@Getter
@Setter
@Accessors(chain = true)
@ToString
public class Employee implements Serializable {
@Field("id")
private long id;
@Field("emp_userName")
private String userName;
@Field("emp_nickName")
private String nickName;
@Field("emp_avatar")
private String avatar;
@Field("emp_describe")
private String describe;
@Field("emp_occupation")
private String occupation;
@Field("emp_salary")
private double salary;
@Field("emp_skill_*")
@Dynamic
private Map<String, String> skillMap;
@Field("emp_updTime")
private Date updTime;
}
package com.hf.solr;
import com.hf.solr.entity.Employee;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.*;
import org.springframework.data.solr.core.query.result.HighlightEntry;
import org.springframework.data.solr.core.query.result.HighlightPage;
import org.springframework.data.solr.core.query.result.ScoredPage;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-solr.xml")
public class TestSolrTemplate {
@Autowired
private SolrTemplate solrTemplate;
@Test
public void SolrAdvancedSearch() {
HashMap<String, Object> map = new HashMap<>();
map.put("keywords", "张三的座右铭是莫等闲");
map.put("userName", "张三");
map.put("occupation", "");
map.put("salary", "7852_27354");
map.put("sort", "DESC");
map.put("sortField", "salary");
map.put("pageNum", 1);
map.put("pageSize", 20);
HashMap<String, String> skMap = new HashMap<>();
skMap.put("Java", "框架");
map.put("skillMap", skMap);
HashMap<String, Object> resMap = searchList(map);
System.out.println("总页数:" + resMap.get("totalPages"));
System.out.println("总条数:" + resMap.get("total"));
List<Employee> list = (List<Employee>) resMap.get("rows");
for (Employee employee : list) {
System.out.println(employee);
}
}
private HashMap<String, Object> searchList(Map<String, Object> searchMap) {
HashMap<String, Object> map = new HashMap<>();
SimpleHighlightQuery query = new SimpleHighlightQuery();
HighlightOptions highlightOptions = new HighlightOptions().addField("emp_userName");
highlightOptions.setSimplePrefix("<em style='color:red'>");
highlightOptions.setSimplePostfix("</em>");
query.setHighlightOptions(highlightOptions);
Criteria criteria = new Criteria("emp_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria);
if (StringUtils.isNotBlank((String) searchMap.get("userName"))) {
FilterQuery filterQuery = new SimpleFilterQuery();
Criteria filterCriteria = new Criteria("emp_userName").is((String) searchMap.get("userName"));
filterQuery.addCriteria(filterCriteria);
query.addFilterQuery(filterQuery);
}
if (StringUtils.isNotBlank((String) searchMap.get("occupation"))) {
FilterQuery filterQuery = new SimpleFilterQuery();
Criteria filterCriteria = new Criteria("emp_occupation").is((String) searchMap.get("emp_occupation"));
filterQuery.addCriteria(filterCriteria);
query.addFilterQuery(filterQuery);
}
if (null != searchMap.get("skillMap")) {
Map<String, String> specMap = (Map<String, String>) searchMap.get("skillMap");
for (String key : specMap.keySet()) {
FilterQuery filterQuery = new SimpleFilterQuery();
Criteria filterCriteria = new Criteria("emp_skill_" + key).is((String) searchMap.get(key));
filterQuery.addCriteria(filterCriteria);
query.addFilterQuery(filterQuery);
}
}
if (StringUtils.isNotBlank((String) searchMap.get("salary"))) {
String[] price = ((String) searchMap.get("salary")).split("_");
if (!StringUtils.equals("0", price[0])) {
FilterQuery filterQuery = new SimpleFilterQuery();
Criteria filterCriteria = new Criteria("emp_salary").greaterThanEqual(price[0]);
filterQuery.addCriteria(filterCriteria);
query.addFilterQuery(filterQuery);
}
if (!StringUtils.equals("*", price[1])) {
FilterQuery filterQuery = new SimpleFilterQuery();
Criteria filterCriteria = new Criteria("emp_salary").lessThanEqual(price[1]);
filterQuery.addCriteria(filterCriteria);
query.addFilterQuery(filterQuery);
}
}
Integer pageNum = (Integer) searchMap.get("pageNum");
pageNum = pageNum != null ? pageNum : 1;
Integer pageSize = (Integer) searchMap.get("pageSize");
pageSize = pageSize != null ? pageSize : 20;
query.setOffset((pageNum - 1) * pageSize);
query.setRows(pageSize);
String sortVal = (String) searchMap.get("sort");
if (StringUtils.isNotBlank(sortVal)) {
String sortField = (String) searchMap.get("sortField");
Sort sort = new Sort(StringUtils.equals("ASC", sortVal) ? Sort.Direction.ASC : Sort.Direction.DESC, "emp_" + sortField);
query.addSort(sort);
}
HighlightPage<Employee> page = solrTemplate.queryForHighlightPage(query, Employee.class);
List<HighlightEntry<Employee>> entryList = page.getHighlighted();
for (HighlightEntry<Employee> entry : entryList) {
List<HighlightEntry.Highlight> highlightList = entry.getHighlights();
/*for (HighlightEntry.Highlight h : highlightList) {
List<String> sms = h.getSnipplets();
}*/
if (highlightList != null && highlightList.size() > 0 && highlightList.get(0).getSnipplets().size() > 0) {
Employee employee = entry.getEntity();
employee.setUserName(highlightList.get(0).getSnipplets().get(0));
}
}
map.put("rows", page.getContent());
map.put("totalPages", page.getTotalPages());
map.put("total", page.getTotalElements());
return map;
}
@Test
public void delAll() {
Query query = new SimpleQuery("*:*");
solrTemplate.delete(query);
solrTemplate.commit();
}
@Test
public void delById() {
solrTemplate.deleteById("563528");
solrTemplate.commit();
}
@Test
public void testPageQuery() {
SimpleQuery query = new SimpleQuery("*:*");
query.setOffset(10);
query.setRows(50);
ScoredPage<Employee> page = solrTemplate.queryForPage(query, Employee.class);
System.out.println("总记录数:" + page.getTotalElements());
System.out.println("总页数:" + page.getTotalPages());
for (Employee emp : page.getContent()) {
System.out.println(emp);
}
}
@Test
public void testConditionQuery() {
SimpleQuery query = new SimpleQuery("*:*");
Criteria criteria = new Criteria("emp_userName").contains("刘一");
query.addCriteria(criteria);
ScoredPage<Employee> page = solrTemplate.queryForPage(query, Employee.class);
System.out.println("匹配条数:" + page.getContent().size());
}
@Test
public void findById() {
Employee employee = solrTemplate.getById(4891920, Employee.class);
System.out.println(employee);
}
@Test
public void testAdd() {
String[] nameArr = {"刘一", "陈二", "张三", "李四", "王五", "赵六"};
String[] avatarArr = {
"http://39.105.173.146:8888/group1/M00/00/00/rBFs1l2IqpiAWwSRAACvSWwZ4Vk685.jpg",
"http://39.105.173.146:8888/group1/M00/00/00/rBFs1l2IqpyAKBcEAABanhy4-9w450.jpg",
"http://39.105.173.146:8888/group1/M00/00/00/rBFs1l2IqqGAYBtiAABxgy7RG9Q393.jpg",
"http://39.105.173.146:8888/group1/M00/00/00/rBFs1l2IqqaAN6TWAABthLrydRU528.jpg"
};
String[] skillKey = new String[]{"Java", "Spring", "SpringMVC", "Mybatis", "Jenkins"};
String[] skillVal = new String[]{"Java 是一门很好的语言", "Spring 是一个优秀的框架", "SpringMVC 是一个优秀的分层控制框架", "Mybatis 是一个很好的持久层框架", "Jenkins 是一个很好的持续化集成工具"};
ArrayList<Employee> employeeArrayList = new ArrayList<>();
for (int i = 0; i < 3000; i++) {
int index = (int) (Math.random() * 5);
int keyIndex = (int) (Math.random() * 4);
HashMap<String, String> strMap = new HashMap<>();
strMap.put(skillKey[keyIndex], skillVal[keyIndex]);
employeeArrayList.add(
new Employee()
.setId(((int) (Math.random() * 90000)) * ((int) (Math.random() * 900000)))
.setUserName(nameArr[index])
.setNickName(nameArr[index] + UUID.randomUUID().toString().substring(6).toUpperCase())
.setAvatar(avatarArr[(int) (Math.random() * 3)])
.setDescribe("您好,我叫:" + nameArr[index] + "、我的座右铭是:" + new String[]{"【你若精彩,天自安排。】", "【莫等闲、白了少年头、空悲切!!】", "【会当凌绝顶,一览众山小。】", "【懂得低头,才能出头。】"}[(int) (Math.random() * 3)])
.setOccupation(new String[]{"厨师", "高管", "项目经理", "架构师"}[(int) (Math.random() * 3)])
.setSalary((int) (Math.random() * 30000))
.setUpdTime(new Date())
.setSkillMap(strMap)
);
}
solrTemplate.saveBeans(employeeArrayList);
solrTemplate.commit();
}
}