全文索引原理:
可以理解为一本词典。现在有100个商品名称,首先用分词器处理(拆分、去标点、去无意义的词等)得到词元,然后创建索引文件。进行检索时,在索引表中找关键词,如果有多个关键词,将查找结果合并。
使用:
-
创建spring-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服务器地址 - Ip + 端口 + solr项目名称 + core实例名称->
<solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr/new_core"/>
<!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg ref="solrServer"/>
</bean>
</beans>
-
数据库数据批量导入Solr索引库
@Component
public class SolrUtil {
@Autowired
private GoodsMapper goodsMapper;
@Autowired
private SolrTemplate solrTemplate;
/**
* 实现将数据库中的数据批量导入到Solr索引库中
*/
public void importGoodsData() {
List<Goods> list = goodsMapper.findAll();
System.out.println("====商品列表====");
for (Goods goods : list) {
System.out.println(goods.getTitle());
}
solrTemplate.saveBeans(list);
solrTemplate.commit(); //提交
System.out.println("====结束====");
}
}
-
实现Solr搜索功能
public Map<String, Object> search(Map searchMap) {
Map<String, Object> map = new HashMap<String, Object>();
Query query = new SimpleQuery();
//添加查询条件
Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria);
ScoredPage<Goods> page = solrTemplate.queryForPage(query, Goods.class);
map.put("rows", page.getContent()); //返回查询到的数据
return map;
}
-
实现分页查询
//分页查询
Integer pageCode = (Integer) searchMap.get("pageCode");
if (pageCode == null) {
pageCode = 1; //默认第一页
}
Integer pageSize = (Integer) searchMap.get("pageSize");
if (pageSize == null) {
pageSize = 18; //默认18
}
query.setOffset((pageCode - 1) * pageSize); //从第几条记录开始查询:= 当前页 * 每页的记录数
query.setRows(pageSize);
ScoredPage<Goods> page = solrTemplate.queryForPage(query, Goods.class);
-
实现条件过滤
//按品牌过滤
if (searchMap.get("brand") != null) {
if (!searchMap.get("brand").equals("")) {
System.out.println("执行了brand...");
FilterQuery filterQuery = new SimpleFilterQuery();
Criteria filterCriteria = new Criteria("item_brand").is(searchMap.get("brand"));
filterQuery.addCriteria(filterCriteria);
query.addFilterQuery(filterQuery);
}
}
-
实现商品价格升降过滤
//按价格的升降序查询
if (searchMap.get("sort") != null) {
if (!searchMap.get("sort").equals("")) {
String sortValue = (String) searchMap.get("sort");
String sortField = (String) searchMap.get("field");
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);
}
}
}
}
-
实现查询结果高亮显示
HighlightQuery query = new SimpleHighlightQuery();
HighlightOptions highlightOptions = new HighlightOptions().addField("item_title"); //设置高亮的域
highlightOptions.setSimplePrefix("<em style='color: red'>"); //设置高亮前缀
highlightOptions.setSimplePostfix("</em>"); //设置高亮后缀
query.setHighlightOptions(highlightOptions); //设置高亮选项
-
更新索引
@Override
public void create(Goods goods) {
goodsMapper.create(goods);
Long id = goodsMapper.maxId(); //获取根据主键自增插入的最新一条记录的ID值
goods.setId(id);
//更新索引库
solrTemplate.saveBean(goods);
solrTemplate.commit();
}
@Override
public void update(Goods goods) {
goodsMapper.update(goods);
//更新索引库
solrTemplate.deleteById(String.valueOf(goods.getId()));
solrTemplate.commit();
List<Goods> list = new ArrayList<Goods>();
list.add(goods);
solrTemplate.saveBeans(list);
solrTemplate.commit();
}
@Override
public void delete(Long... ids) {
for (Long id : ids) {
goodsMapper.delete(id);
//更新索引库
solrTemplate.deleteById(String.valueOf(id));
solrTemplate.commit();
}
}