- 导入依赖
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>1.5.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
- 配置spring对solr封装的配置文件:applicationContext-solr.xml
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:solr="http://www.springframework.org/schema/data/solr"
xsi:schemaLocation="http://www.springframework.org/schema/data/solr
http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- solr服务器地址 -->
<solr:solr-server id="solrServer" url="http://192.168.25.128:8081/solr" />
<!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg ref="solrServer" />
</bean>
</beans>
- 在需要使用solr查询的实体类中添加solr域
package com.pinyougou.pojo;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.solr.core.mapping.Dynamic;
public class TbItem implements Serializable{
//solr中配置的域
@Field("id")
private Long id;
@Field("item_title")
private String title;
private String sellPoint;
@Field("item_price")
private BigDecimal price;
private Integer stockCount;
private Integer num;
private String barcode;
@Field("item_image")
private String image;
private Long categoryid;
private String status;
private Date createTime;
@Field("item_updatetime")
private Date updateTime;
private String itemSn;
private BigDecimal costPirce;
private BigDecimal marketPrice;
private String isDefault;
@Field("item_goodsid")
private Long goodsId;
private String sellerId;
private String cartThumbnail;
@Field("item_category")
private String category;
@Field("item_brand")
private String brand;
private String spec;
@Field("item_seller")
private String seller;
//solr中配置的动态域
@Dynamic
@Field("item_spec_*")
private Map<String,String> specMap;
}
- 使用solr模板类进行高亮查询
public class SearchServiceImpl implements SearchService{
@Autowired
private SolrTemplate solrTemplate;
/**
* 查询高亮集合
* @param searchMap
* @return
*/
private Map searchMapHighlightMap(Map searchMap) {
Map map = new HashMap();
//高亮显示
HighlightQuery query = new SimpleHighlightQuery();
//设置高亮域
HighlightOptions highlightOptions = new HighlightOptions().addField("item_title");
//高亮前缀
highlightOptions.setSimplePrefix("<em style='color:red'>");
//高亮后缀
highlightOptions.setSimplePostfix("</em>");
//设置高亮选项
query.setHighlightOptions(highlightOptions);
//设置查询域
//new Criteria("item_keywords"); 要查询的域
//searchMap.get("keywords")要查询的字段
Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
//添加条件
query.addCriteria(criteria);
//获取高亮页
HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class);
//获取高亮入口集合
List<HighlightEntry<TbItem>> list = page.getHighlighted();
//循环高亮入口集合(获取每个entry)
for (HighlightEntry<TbItem> entry : list) {
//获取实体对象
TbItem tbItem = entry.getEntity();
//获取高亮列表(集合)
List<Highlight> highlights = entry.getHighlights();
//遍历高亮列表,获取每个高亮域
for (Highlight highlight : highlights) {
//获取内容数组
List<String> snipplets = highlight.getSnipplets();
//获取内容
String title = snipplets.get(0);
//设置高亮
tbItem.setTitle(title);
}
}
}
- 分组查询
/**
* 分组查询
* @param searchMap
* @return
*/
private List<String> searchCategoryList(Map searchMap) {
List<String> list = new ArrayList<String>();
Query query = new SimpleQuery("*:*");
//设置条件
//new Criteria("item_keywords") 要查询的域
//searchMap.get("keywords") 要查询的字段
Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
//添加条件
query.addCriteria(criteria);
//设置分组选项
GroupOptions groupOptions = new GroupOptions();
//根据item_category分组
//where...
groupOptions.addGroupByField("item_category");
//添加分组选项
query.setGroupOptions(groupOptions);
//获取分组页
GroupPage<TbItem> page = solrTemplate.queryForGroupPage(query, TbItem.class);
//根据列获取分组结果集
//group by...
GroupResult<TbItem> groupResult = page.getGroupResult("item_category");
//根据结果集获取入口页
Page<GroupEntry<TbItem>> groupEntries = groupResult.getGroupEntries();
//循环遍历入口集合
for (GroupEntry<TbItem> entry : groupEntries) {
//获取分组值
String value = entry.getGroupValue();
//添加到集合
list.add(value);
}
return list;
}