1. solr中关键对象,参数或配置文件
关键字: solrHome,分词器
配置文件: schema.xml:配置字段,字段类型
web.xml:配置solrHme的位置
客户端: solrJ
对象: solrServer,SolrQuery
2. solr的维护:
2.1 solr中中维护包括增,删,改,查,注意solr中没有修改
(1) 向solr 库中添加:
public void addDocument() throws Exception {
//创建一连接
SolrServer solrServer = new HttpSolrServer("http://192.168.254.130:8080/solr");
//创建一个文档对象
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "test001");
document.addField("item_title", "测试商品2");
document.addField("item_price", 54321);
//把文档对象写入索引库
solrServer.add(document);
//提交
solrServer.commit();
}
(2) 更新: 添加一个id值一样的,就将原来的更新了:
public void addDocument() throws Exception {
//创建一连接
SolrServer solrServer = new HttpSolrServer("http://192.168.254.130:8080/solr");
//创建一个文档对象
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "test001");
document.addField("item_title", "测试商品3");
document.addField("item_price", 1233333);
//把文档对象写入索引库
solrServer.add(document);
//提交
solrServer.commit();
}
(3)删除:
public void deleteDocument() throws Exception {
//创建一连接
SolrServer solrServer = new HttpSolrServer("http://192.168.254.130:8080/solr");
//solrServer.deleteById("test001");
solrServer.deleteByQuery("*:*");
solrServer.commit();
}
(4)查询:
public void queryDocument() throws Exception {
SolrServer solrServer = new HttpSolrServer("http://192.168.254.130:8080/solr");
//创建一个查询对象
SolrQuery query = new SolrQuery();
//设置查询条件
query.setQuery("*:*");
query.setStart(20);
query.setRows(50);
//执行查询
QueryResponse response = solrServer.query(query);
//取查询结果
SolrDocumentList solrDocumentList = response.getResults();
System.out.println("共查询到记录:" + solrDocumentList.getNumFound());
for (SolrDocument solrDocument : solrDocumentList) {
System.out.println(solrDocument.get("id"));
System.out.println(solrDocument.get("item_title"));
System.out.println(solrDocument.get("item_price"));
System.out.println(solrDocument.get("item_image"));
}
}
2.2 与spring的整合例子在: taotao-search中 ItemServiceImpl
添加例子
@Service
public class ItemServiceImpl implements ItemService{
@Resource
private ItemMapper itemMapper;
@Resource
private SolrServer solrServer;
@Override
public TaotaoResult importAllItems() {
//从数据库中查出商品列表
List<Item> list = itemMapper.getItemList();
//将list中的数据导入到 solr中
try {
for(Item item:list){
//创建一个文档对象
SolrInputDocument document = new SolrInputDocument();
document.addField("id", item.getId());
document.addField("item_title", item.getTitle());
document.addField("item_sell_point", item.getSell_point());
document.addField("item_price", item.getPrice());
document.addField("item_image", item.getImage());
document.addField("item_category_name", item.getCategory_name());
//把文档对象写入索引库
solrServer.add(document);
}
solrServer.commit();
return TaotaoResult.ok();
} catch (Exception e) {
e.printStackTrace();
return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
}
}
查询例子:
package com.taotao.search.service.impl;
import javax.annotation.Resource;
import org.apache.solr.client.solrj.SolrQuery;
import org.springframework.stereotype.Service;
import com.taotao.search.dao.SearchDao;
import com.taotao.search.pojo.SearchResult;
import com.taotao.search.service.SearchService;
@Service
public class SearchServiceImpl implements SearchService {
@Resource
private SearchDao searchDao;
@Override
public SearchResult search(String queryString, int page, int rows) throws Exception {
// 创建查询对象
SolrQuery query = new SolrQuery();
// 设置查询条件
query.setQuery(queryString);
// 设置分页
query.setStart((page - 1) * rows);
query.setRows(rows);
// 设置默认搜素域
query.set("df", "item_keywords");
// 设置高亮显示
query.setHighlight(true);
query.addHighlightField("item_title");
query.setHighlightSimplePre("<em style=\"color:red\">");
query.setHighlightSimplePost("</em>");
// 执行查询
SearchResult searchResult = searchDao.search(query);
// 计算查询结果总页数
long recordCount = searchResult.getRecordCount();
//算法:如果总行数不能被每页行数整除,则在显示页面上加1
long pageCount = recordCount / rows;
if (recordCount % rows > 0) {
pageCount++;
}
searchResult.setPageCount(pageCount);
searchResult.setCurPage(page);
return searchResult;
}
}
依赖的searchDao代码为:
package com.taotao.search.dao.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
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 com.taotao.search.dao.SearchDao;
import com.taotao.search.pojo.Item;
import com.taotao.search.pojo.SearchResult;
/**
* 商品搜索Dao
* <p>Title: SearchDaoImpl</p>
* <p>Description: </p>
* <p>Company: </p>
* @author 杨凯
* @date 2015年9月11日下午3:26:25
* @version 1.0
*/
@Repository
public class SearchDaoImpl implements SearchDao {
@Autowired
private SolrServer solrServer;
@Override
public SearchResult search(SolrQuery query) throws Exception {
//返回值对象
SearchResult result = new SearchResult();
//根据查询条件查询索引库
QueryResponse queryResponse = solrServer.query(query);
//取查询结果
SolrDocumentList solrDocumentList = queryResponse.getResults();
//取查询结果总数量
result.setRecordCount(solrDocumentList.getNumFound());
//商品列表
List<Item> itemList = new ArrayList<>();
//取高亮显示
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
//取商品列表
for (SolrDocument solrDocument : solrDocumentList) {
//创建一商品对象
Item item = new Item();
item.setId(Long.parseLong((String)solrDocument.get("id")) );
//取高亮显示的结果
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(title);
item.setImage((String) solrDocument.get("item_image"));
item.setPrice((long) solrDocument.get("item_price"));
//设置卖点
item.setSell_point((String) solrDocument.get("item_sell_point"));
//商品分类
item.setCategory_name((String) solrDocument.get("item_category_name"));
//添加的商品列表
itemList.add(item);
}
result.setItemList(itemList);
return result;
}
}