solr查询列表并高亮显示

private Map<String, Object> searchList(Map searchMap) {
		// 高亮选项初始化
		Map<String, Object> map = new HashMap<>();
		HighlightQuery query = new SimpleHighlightQuery();
		// 设置高亮的域
		HighlightOptions highlightOptions = new HighlightOptions().addField("item_title");
		// 高亮前缀
		highlightOptions.setSimplePrefix("<em style='color:red'>");
		// 高亮后缀
		highlightOptions.setSimplePostfix("</em>");
		// 为查询结果设置高亮
		query.setHighlightOptions(highlightOptions);

		// 1.1添加查询条件
		Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
		query.addCriteria(criteria);

		// 1.2按分类筛选
		if (!"".equals(searchMap.get("category"))) { // 当存在分类条件的时候执行
			FilterQuery filterQuery = new SimpleFilterQuery();
			Criteria filterCriteria = new Criteria("item_category").is(searchMap.get("category"));
			filterQuery.addCriteria(filterCriteria);
			query.addFilterQuery(filterQuery);
		}

		// 1.3按品牌筛选
		if (!"".equals(searchMap.get("brand"))) { // 当存在分类条件的时候执行
			FilterQuery filterQuery = new SimpleFilterQuery();
			Criteria filterCriteria = new Criteria("item_brand").is(searchMap.get("brand"));
			filterQuery.addCriteria(filterCriteria);
			query.addFilterQuery(filterQuery);
		}

		// 1.4按规格筛选
		if (searchMap.get("spec") != null) {// 当存在规格条件的时候执行
			Map<String, String> specMap = (Map<String, String>) searchMap.get("spec");
			for (String key : specMap.keySet()) {
				FilterQuery filterQuery = new SimpleFilterQuery();
				Criteria filterCriteria = new Criteria("item_spec_" + key).is(specMap.get(key));
				filterQuery.addCriteria(filterCriteria);
				query.addFilterQuery(filterQuery);
			}
		}

		// 1.5价格筛选
		if (!"".equals(searchMap.get("price"))) {
			String[] price = ((String) searchMap.get("price")).split("-");
			if (!price[0].equals("0")) {// 如果区间起点不等于0
				FilterQuery filterQuery = new SimpleFilterQuery();
				Criteria filterCriteria = new Criteria("item_price").greaterThanEqual(price[0]);
				filterQuery.addCriteria(filterCriteria);
				query.addFilterQuery(filterQuery);
			}
			if (!price[1].equals("*")) {// 如果区间终点不等于*
				FilterQuery filterQuery = new SimpleFilterQuery();
				Criteria filterCriteria = new Criteria("item_price").lessThanEqual(price[1]);
				filterQuery.addCriteria(filterCriteria);
				query.addFilterQuery(filterQuery);
			}
		}

		// 1.6 分页查询
		Integer currPage = (Integer) searchMap.get("currPage"); // 提取页码
		Integer pageSize = (Integer) searchMap.get("pageSize"); // 每页记录数
		if (currPage == null) {
			currPage = 1; // 默认第一页
		}
		if (pageSize == null) {
			pageSize = 15; // 默认15
		}
		query.setOffset((currPage - 1) * pageSize); // 从第几条记录查询
		query.setRows(pageSize); // 每页记录数

		// 1.7 排序
		String sortField = (String) searchMap.get("sortField");// 排序字段
		String sortValue = (String) searchMap.get("sort");// ASC DESC
		if (sortValue != null && !sortValue.equals("")) {
			if (sortValue.equals("ASC")) {
				Sort sort = new Sort(Sort.Direction.ASC, "item_" + sortField);
				query.addSort(sort);
			} else if (sortValue.equals("DESC")) {
				Sort sort = new Sort(Sort.Direction.DESC, "item_" + sortField);
				query.addSort(sort);
			}
		}

		// ******************** 获取高亮结果集 ******************************
		// 高亮页对象
		HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class);
		// 循环高亮入口集合(每天记录的高亮入口)
		List<HighlightEntry<TbItem>> list = page.getHighlighted();
		// 对应的搜索记录
		for (HighlightEntry<TbItem> highlightEntry : list) {
			// 获取高亮列表(高亮域的个数)
			/*
			 * 高亮集合对象(储存的所有的高亮列) List<Highlight> highlights =
			 * highlightEntry.getHighlights(); 高亮对象 for (Highlight highlight : highlights) {
			 * 获取所有值的高亮 List<String> snipplets = highlight.getSnipplets();
			 * System.out.println(snipplets); }
			 */
			// 由于我们要查询的只有一个域和一个值,就可以这样写,直接获取值的高亮
			TbItem item = highlightEntry.getEntity();
			if (highlightEntry.getHighlights().size() > 0
					&& highlightEntry.getHighlights().get(0).getSnipplets().size() > 0) {
				item.setTitle(highlightEntry.getHighlights().get(0).getSnipplets().get(0));// 设置高亮结果
			}
		}
		map.put("rows", page.getContent());
		map.put("totalPages", page.getTotalPages());// 返回总页数
		map.put("totalSize", page.getTotalElements()); // 返回总记录数
		return map;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值