Spring Data Solr简介

  虽然支持任何编程语言的能力具有很大的市场价值,你可能感兴趣的问题是:我如何将Solr的应用集成到Spring中?可以,Spring Data Solr就是为了方便Solr的开发所研制的一个框架,其底层是对SolrJ(官方API)的封装。

简单案例:

pom.xml

<dependencies>
<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>
</dependencies>

在src/main/resources下创建 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: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"> <!-- solr服务器地址 -->
<solr:solr-server id="solrServer" url="http://192.168.44.35:8080/solr" /> <!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg ref="solrServer" />
</bean>
</beans>

如果连的是solrCloud集群:

    <!-- solr服务器地址
<solr:solr-server id="solrServer" url="http://192.168.44.35:8080/solr" />
-->
<bean id="solrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
<constructor-arg value="192.168.25.140:2181,192.168.25.140:2182,192.168.25.140:2183" />
<property name="defaultCollection" value="collection1"></property>
</bean>

@Field 注解

public class TestBean implements Serializable {
// @Field 用来指定那些成员属性是document的字段的
@Field
private String id;
@Field("title")
private String title;
@Field("content")
private String content;
@Field("name")
private String name;
//getter and setters
}

使用spring data solr执行CURD

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext-solr.xml")
public class TestTemplate { @Autowired
private SolrTemplate solrTemplate; //添加
@Test
public void testAdd(){
TestBean item=new TestBean();
item.setId("1");
item.setTitle("testTitle");
item.setContent("testContent");
item.setName("testName");
solrTemplate.saveBean(item);
solrTemplate.commit();
}
//根据id删除
@Test
public void testDelete(){
solrTemplate.deleteById("1");
solrTemplate.commit();
}
//分页查询
@Test
public void testPageQuery(){
Query query=new SimpleQuery("*:*");
query.setOffset(20);//开始索引(默认0)
query.setRows(20);//每页记录数(默认10)
ScoredPage<TestBean> page = solrTemplate.queryForPage(query, TestBean.class);
System.out.println("总记录数:"+page.getTotalElements());
List<TestBean> list = page.getContent();
showList(list);
}
//显示记录数据
private void showList(List<TestBean> list){
for(TestBean item:list){
System.out.println(item.getTitle());
}
}
//条件查询
@Test
public void testPageQueryMutil(){
Query query=new SimpleQuery("*:*");
Criteria criteria=new Criteria("title").contains("2");
criteria=criteria.and("title").contains("5");
query.addCriteria(criteria);
//query.setOffset(20);//开始索引(默认0)
//query.setRows(20);//每页记录数(默认10)
ScoredPage<TestBean> page = solrTemplate.queryForPage(query, TestBean.class);
System.out.println("总记录数:"+page.getTotalElements());
List<TestBean> list = page.getContent();
showList(list);
}
//删除全部
@Test
public void testDeleteAll(){
Query query=new SimpleQuery("*:*");
solrTemplate.delete(query);
solrTemplate.commit();
}
}

补充:模拟商品(sku) 查询  数据存放在solr中  查询相关条件放到redis做缓存

package com.zy.search.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.zy.pojo.TbItem;
import com.zy.search.service.ItemSearchService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.*;
import org.springframework.data.solr.core.query.result.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; @Service
public class ItemSearchServiceImpl implements ItemSearchService {
@Autowired
private SolrTemplate solrTemplate; @Autowired
private RedisTemplate redisTemplate; /**
* 模拟商品查询方法
* searchMap格式 {'keywords': '', 'category': '', 'brand': '', 'spec': {},'price': '','pageNo': 1,'pageSize': 20,'sortField':'','sort':''}
*/
@Override
public Map<String, Object> search(Map searchMap) {
Map<String, Object> map = new HashMap<>();
//按关键字查询 高亮显示
map.putAll(searchResultList(searchMap));
//根据关键字查询商品分类
List categoryList = searchCategoryList(searchMap);
map.put("categoryList", categoryList);
//查询品牌和规格列表
String categoryName = (String) searchMap.get("category");
if (categoryList == null || !"".equals(categoryName)) {//如果有分类名称
map.putAll(searchBrandAndSpecList(categoryName));
} else {//如果没有分类名称,按照第一个查询
if (categoryList.size() > 0) {
map.putAll(searchBrandAndSpecList((String) categoryList.get(0)));
}
}
return map;
} /**
* 第二版 筛选过滤后的 带高亮的数据
*/
private Map<String, Object> searchResultList(Map searchMap) {
Map<String, Object> map = new HashMap<>(); //***********************关键字空格处理***********************
String keywords = (String) searchMap.get("keywords");
searchMap.put("keywords", keywords.replace(" ", "")); HighlightQuery query = new SimpleHighlightQuery(); //***********************按关键字查询***********************
Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria); //---------------------------过滤查询start--------------------------- //***********************按分类筛选***********************
if (searchMap.get("category") != null && !"".equals(searchMap.get("category"))) {
Criteria filterCriteria = new Criteria("item_category").is(searchMap.get("category"));
FilterQuery filterQuery = new SimpleFilterQuery(filterCriteria);
query.addFilterQuery(filterQuery);
}
//***********************按品牌筛选***********************
if (searchMap.get("brand") != null && !"".equals(searchMap.get("brand"))) {
Criteria filterCriteria = new Criteria("item_brand").is(searchMap.get("brand"));
FilterQuery filterQuery = new SimpleFilterQuery(filterCriteria);
query.addFilterQuery(filterQuery);
}
//***********************规格过滤筛选***********************
if (searchMap.get("spec") != null) {
Map<String, String> specMap = (Map) searchMap.get("spec");
for (String key : specMap.keySet()) {
Criteria filterCriteria = new Criteria("item_spec_" + key).is(specMap.get(key));
FilterQuery filterQuery = new SimpleFilterQuery(filterCriteria);
query.addFilterQuery(filterQuery);
}
} //***********************价格过滤筛选***********************
if (!"".equals(searchMap.get("price"))) {
String[] price = ((String) searchMap.get("price")).split("-");
if (!price[0].equals("0")) {//如果区间起点不等于0
Criteria filterCriteria = new Criteria("item_price").greaterThanEqual(price[0]);
FilterQuery filterQuery = new SimpleFilterQuery(filterCriteria);
query.addFilterQuery(filterQuery);
}
if (!price[1].equals("*")) {//如果区间终点不等于*
Criteria filterCriteria = new Criteria("item_price").lessThanEqual(price[1]);
FilterQuery filterQuery = new SimpleFilterQuery(filterCriteria);
query.addFilterQuery(filterQuery);
}
}
//---------------------------过滤查询end--------------------------- //***********************分页查询**********************
Integer pageNo = (Integer) searchMap.get("pageNo");//提取页码
if (pageNo == null) {
pageNo = 1;//默认第一页
}
Integer pageSize = (Integer) searchMap.get("pageSize");//每页记录数
if (pageSize == null) {
pageSize = 20;//默认20
}
query.setOffset((pageNo - 1) * pageSize);//从第几条记录查询
query.setRows(pageSize); //***********************排序***********************
String sortValue = (String) searchMap.get("sort");//ASC DESC
String sortField = (String) searchMap.get("sortField");//排序字段
if (sortValue != null && !sortValue.equals("")) {
if (sortValue.equals("ASC")) {
Sort sort = new Sort(Sort.Direction.ASC, "item_" + sortField);
query.addSort(sort);
}
if (sortValue.equals("DESC")) {
Sort sort = new Sort(Sort.Direction.DESC, "item_" + sortField);
query.addSort(sort);
}
} //***********************高亮设置***********************
//设置高亮的域
HighlightOptions highlightOptions = new HighlightOptions().addField("item_title");
//高亮前缀
highlightOptions.setSimplePrefix("<em style='color:red'>");
//高亮后缀
highlightOptions.setSimplePostfix("</em>");
//设置高亮选项
query.setHighlightOptions(highlightOptions); //***********************获取数据***********************
HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class); //***********************设置高亮结果***********************
List<HighlightEntry<TbItem>> highlighted = page.getHighlighted();
for (HighlightEntry<TbItem> h : highlighted) {//循环高亮入口集合
TbItem item = h.getEntity();//获取原实体类
if (h.getHighlights().size() > 0 && h.getHighlights().get(0).getSnipplets().size() > 0) {
item.setTitle(h.getHighlights().get(0).getSnipplets().get(0));//设置高亮的结果
}
}
//***********************给map赋值***********************
map.put("rows", page.getContent());
map.put("total", page.getTotalElements());
map.put("totalPages", page.getTotalPages());
return map;
} /**
* 第一版 单纯读取数据
*/
private Map<String, Object> searchBase(Map searchMap) {
Map<String, Object> map = new HashMap<>();
Query query = new SimpleQuery();
Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria);
ScoredPage<TbItem> scoredPage = solrTemplate.queryForPage(query, TbItem.class);
List<TbItem> itemList = scoredPage.getContent(); map.put("rows", itemList);
map.put("total", scoredPage.getTotalElements());
map.put("totalPages", scoredPage.getTotalPages());
return map;
} /**
* 查询品牌和规格列表
*/
private Map searchBrandAndSpecList(String category) {
Map map = new HashMap();
Long typeId = (Long) redisTemplate.boundHashOps("itemCat").get(category);//获取模板ID
if (typeId != null) {
//根据模板ID查询品牌列表
List brandList = (List) redisTemplate.boundHashOps("brandList").get(typeId);
map.put("brandList", brandList);//返回值添加品牌列表
//根据模板ID查询规格列表
List specList = (List) redisTemplate.boundHashOps("specList").get(typeId);
map.put("specList", specList);
}
return map;
} /**
* 查询分类列表 category 根据搜索关键字分组查询
*/
private List searchCategoryList(Map searchMap) {
List<String> list = new ArrayList();
Query query = new SimpleQuery();
//按照关键字查询
Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria);
//设置分组选项
GroupOptions groupOptions = new GroupOptions().addGroupByField("item_category");
query.setGroupOptions(groupOptions);
//得到分组页
GroupPage<TbItem> page = solrTemplate.queryForGroupPage(query, TbItem.class);
//根据列得到分组结果集
GroupResult<TbItem> groupResult = page.getGroupResult("item_category");
//得到分组结果入口页
Page<GroupEntry<TbItem>> groupEntries = groupResult.getGroupEntries();
//得到分组入口集合
List<GroupEntry<TbItem>> content = groupEntries.getContent();
for (GroupEntry<TbItem> entry : content) {
list.add(entry.getGroupValue());//将分组结果的名称封装到返回值中
}
return list;
}
}

Spring Data Solr操作solr的简单案例的更多相关文章

  1. 使用Spring Data Redis操作Redis(集群版)

    说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...

  2. spring data jpa 操作pipelinedb 的continuous view 与stream

    一. 由于pipelinedb是postgreSQL的扩展,因此相关依赖于配置都合集成postgreSQL是一样的. springboot + spring data jpa + postgreSQL ...

  3. 通过Spring Data Neo4J操作您的图形数据库

    在前面的一篇文章<图形数据库Neo4J简介>中,我们已经对其内部所使用的各种机制进行了简单地介绍.而在我们尝试对Neo4J进行大版本升级时,我发现网络上并没有任何成型的样例代码以及简介,而 ...

  4. Spring Boot (五)Spring Data JPA 操作 MySQL 8

    一.Spring Data JPA 介绍 JPA(Java Persistence API)Java持久化API,是 Java 持久化的标准规范,Hibernate是持久化规范的技术实现,而Sprin ...

  5. spring data jpa封装specification实现简单风格的动态查询

    github:https://github.com/peterowang/spring-data-jpa-demo 单一实体的动态查询: @Servicepublic class AdvancedUs ...

  6. Spring Boot使用Spring Data Redis操作Redis(单机/集群)

    说明:Spring Boot简化了Spring Data Redis的引入,只要引入spring-boot-starter-data-redis之后会自动下载相应的Spring Data Redis和 ...

  7. Spring Boot 入门系列(二十七)使用Spring Data JPA 自定义查询如此简单,完全不需要写SQL!

    前面讲了Spring Boot 整合Spring Boot JPA,实现JPA 的增.删.改.查的功能.JPA使用非常简单,只需继承JpaRepository ,无需任何数据访问层和sql语句即可实现 ...

  8. 使用Spring Data Redis操作Redis(单机版)

    说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...

  9. spring data mongodb 操作

    xml配置(mongo集群方式): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=& ...

随机推荐

  1. springMVC+Mybatis的maven-web项目的pom.xml文件内容

    pom.xml文件内容 <!-- 第一行是XML头,指定了该xml文档的版本和编码方式 --> <project xmlns="http://maven.apache.or ...

  2. F4NNIU 版本的标准电阻列表(2018-09-29 更新)

    F4NNIU 版本的标准电阻列表(2018-09-29 更新) 值代码 电阻值 格式化值 单位 公差代码 公差 格式化值数字 描述 0RJ 0 0 R J 5% J0000 0R 5% (0RJ) 1 ...

  3. 【转】python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode

    原文网址:http://blog.csdn.net/trochiluses/article/details/16825269 摘要:在进行python脚本的编写时,如果我们用python来处理网页数据 ...

  4. tomcat日志分类

    综合:Tomcat下相关的日志文件 Cataline引擎的日志文件,文件名catalina.日期.log Tomcat下内部代码丢出的日志,文件名localhost.日期.log(jsp页面内部错误的 ...

  5. BZOJ3261:最大异或和

    浅谈\(Trie\):https://www.cnblogs.com/AKMer/p/10444829.html 题目传送门:https://lydsy.com/JudgeOnline/problem ...

  6. MyEclipse自动生成Ant Build.xm

    关于MyEclipse 自动生成 Ant Build.xml 配置文件,生成的方法很隐蔽,是自己无意中找到的.选择你要生成Build.xml文件的项目,右键. Export-> General ...

  7. java.lang.NoSuchFieldError: TRACE

    Exception in thread "main" java.lang.NoSuchFieldError: TRACE    at org.jboss.logging.Log4j ...

  8. Lombok 简单入门

    原文地址:Lombok 简单入门 博客地址:http://www.extlight.com 一.前言 Lombok 是一个 Java 库,它作为插件安装至编辑器中,其作用是通过简单注解来精简代码,以此 ...

  9. 揭晓UX(用户体验)最大的秘密

    我是佩恩和特勒的粉丝已经多年了.我第一次在现实中看到他们是在上个月,被他们的表演完全迷住了. 我真的很喜欢佩恩和特勒,他们经常“回拉窗帘”,并揭示他们是怎么完成他们的魔法.其他魔术师营造神秘主义和虚假 ...

  10. cowboy的get和post的例子

    官方get和post的代码是有问题的,1.1下运行crash,这里修改了下,贴代码 创建工程 rebar-creator create-app testCowboy testCowboy_app.er ...