SolrJ
Solrj是访问solr服务的java客户端,提供索引和请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务。
实现步骤
(1):导入jar包
jcl-over-slf4j-版本号.jar
jul-to-slf4j-版本号.jar
log4j-版本号.jar
slf4-api-版本号.jar
slf4j-log412-版本号.jar
(2):和Solr服务器建立连接。HttpSolrServer对象建立连接。
(3):创建一个SolrInputDocument对象,然后添加域。
(4):将SolrInputDocument添加到索引库。
(5):提交
向文本域中添加文档
@Test
public void addDocument() throws Exception{
//和solr服务器创建链接
//参数:solr服务器的地址
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
//创建一个文档对象
SolrInputDocument document=new SolrInputDocument();
//向文档添加域
//第一个参数:域名称,域的名称必须是schema.xml中的定义
//第二个参数:域的参数
document.addField("id", "c001");
document.addField("title_ik", "使用sorlj添加文档");
document.addField("contenk_ik", "文档的内容");
document.addField("product_name", "商品的名称");
//把document对象添加到索引库中
solrServer.add(document);
//提交
solrServer.commit();
}
根据查询删除
@Test
public void testDeleteDocumentByQueny() throws Exception, Exception{
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
solrServer.deleteById("*:*");
solrServer.commit();
}
查询语句
@Test
public void testAueryIndex() throws Exception{
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
//创建一个SolrQuery对象
SolrQuery query=new SolrQuery();
//设置查询条件
//query.set("q","*:*");
query.setQuery("*:*");
//执行查询
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("product_name"));
System.out.println(solrDocument.get("product_price"));
System.out.println(solrDocument.get("product_catalog_name"));
System.out.println(solrDocument.get("product_picture"));
}
}
复杂查询
@Test
public void queryIndex() throws Exception{
//创建链接
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
//创建一个query对象
SolrQuery query=new SolrQuery();
//设置查询条件
query.setQuery("钻石");
//过滤条件
query.setFilterQueries("product_catalog_name:幽默杂货铺");
//排序条件
query.setSort("product_price",ORDER.desc);
//分页处理
query.setStart(0);
query.setRows(10);
//结果中域的列表
query.setFields("id","product_name","product_price","product_catalog_name","product_picture");
//设置默认搜索域
query.set("df","product_keywords");
//高亮显示
query.setHighlight(true);
//高亮显示的域
query.addHighlightField("product_name");
//高亮显示的前缀
query.setHighlightSimplePost("<em>");
//高亮显示的后缀
query.setHighlightSimplePost("</em>");
//执行查询、
QueryResponse queryResponse = solrServer.query(query);
//查询结果
SolrDocumentList solrDocumentList=queryResponse.getResults();
System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound());
//遍历查询的结果
for (SolrDocument solrDocument : solrDocumentList) {
System.out.println(solrDocument.get("id"));
//取高亮显示
String productName = "";
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");
//判断是否有高亮内容
if (null != list) {
productName = list.get(0);
} else {
productName = (String) solrDocument.get("product_name");
}
System.out.println(productName);
System.out.println(solrDocument.get("product_price"));
System.out.println(solrDocument.get("product_catalog_name"));
System.out.println(solrDocument.get("product_picture"));
}
}
solr案例
Controller层
@Controller
public class ProductController {
@Autowired
private ProductService productService;
@RequestMapping("/list")
public String productSearch(String queryString, String caltalog_name,String price,
String sort,Integer page, Model model)throws Exception{
//调用服务查询商品列表
ResultModel resultModel = productService.queryProduct(queryString, caltalog_name, price, sort, page);
//传递给页面
model.addAttribute("qeryString",queryString);
model.addAttribute("caltalog_name",caltalog_name);
model.addAttribute("price",price);
model.addAttribute("sort",sort);
model.addAttribute("page",page);
model.addAttribute("result",resultModel);
return "product_list";
}
}
selrvice层
@Service
public class ProductService {
private static final int PAGE_SIZE=60;
@Autowired
ProductDao productDao;
public ResultModel queryProduct(String queryString, String caltalog_name,
String price, String sort, Integer page)throws Exception{
//1、根据参数创建查询对象
SolrQuery query = new SolrQuery();
//设置查询条件
if(null !=queryString && !"".equals(queryString)){
query.setQuery(queryString);
}else{
query.setQuery("*:*");
}
//商品分类过滤
if(null != caltalog_name && !"".equals(caltalog_name)){
query.addFilterQuery("product_catalog_name:"+ caltalog_name);
}
//价格区间过滤
if(null != price && !"".equals(price)){
String [] strings =price.split("-");
query.addFilterQuery("product_price:["+strings[0]+" TO "+strings[1]+"]");
}
//排序条件
if("1".equals(sort)){
query.setSort("product_price",ORDER.desc);
}else {
query.setSort("product_price",ORDER.asc);
}
//分页处理
if(page == null) page = 1;
query.setStart((page-1)* PAGE_SIZE);
query.setRows(PAGE_SIZE);
//默认搜索域
query.set("df", "product_keywords");
//设置高亮
query.setHighlight(true);
query.addHighlightField("product_name");
query.setHighlightSimplePre("<em style=\"color:red\">");
query.setHighlightSimplePost("</em>");
//2.调用dao执行查询
ResultModel resultModel = productDao.search(query);
//3.根据总记录数计算总页数
Long recordCount = resultModel.getRecordCount();
long pageCount = recordCount / PAGE_SIZE;
if(recordCount % PAGE_SIZE > 0 ){
pageCount++;
}
resultModel.setPageCount((int) pageCount);
resultModel.setCurPage(page);
return resultModel;
}
}
dao层
@Repository
public class ProductDao {
@Autowired
private SolrServer solrServer;
public ResultModel search(SolrQuery query)throws Exception{
//执行查询
QueryResponse response = solrServer.query(query);
//取查询结果
SolrDocumentList solrDocumentList = response.getResults();
//取查询结果总记录数
ResultModel resultModel = new ResultModel();
resultModel.setRecordCount(solrDocumentList.getNumFound());
//商品列表
List<ProductModel> productList = new ArrayList<ProductModel>();
//取查询结果
for (SolrDocument solrDocument : solrDocumentList) {
//创建一个商品对象
ProductModel productModel = new ProductModel();
productModel.setPid((String) solrDocument.get("id"));
productModel.setCatalog_name((String) solrDocument.get("product_catalog_name"));
//取高亮显示
Map<String, Map<String,List<String>>> highlighting = response.getHighlighting();
List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");
String productName = "";
if(list != null && list.size()>0){
productName = list.get(0);
}else {
productName = (String) solrDocument.get("product_name");
}
productModel.setName(productName);
productModel.setPicture((String) solrDocument.get("product_picture"));
productModel.setPrice((Float) solrDocument.get("product_price"));
//添加到商品列表
productList.add(productModel);
}
//添加到返回结果
resultModel.setProductList(productList);
return resultModel;
}
}
实体类
private String pid;
private String name;
//商品分类名称
private String catalog_name;
private float price;
private String description;
private String picture;
//商品列表
private List<ProductModel> productList;
private Long recordCount;
private int pageCount;
private int curPage;