lucene与solr03

4 篇文章 0 订阅
3 篇文章 0 订阅

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值