一丶普通关键字查询(代码)
Query query = new SimpleQuery();
//匹配查询条件
Criteria criteria = new Criteria();
//此处的is为匹配的意思,contains为包含
Criteria criteria=new Criteria("item_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria);
query.setOffset(20);//开始索引(默认0)
query.setRows(20);//每页记录数(默认10)
ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
//获取该页的 内容
List<集合对象类型> list = page.getContent()
-
条件 Criteria可以针对多个域,使用方法criteria.and("域名").is/contain...都可对多个域进程匹配查询,需要注意的是每次都需要对criteria重新赋值才能起到查询的作用,例如:
Criteria criteria = new Criteria();
Criteria criteria=new Criteria("item_keywords").is(searchMap.get("keywords"));
// 此处必须重新赋值
criteria = criteria.and("item_name").is('需要匹配的字符串')
二丶过滤查询
-
原理:在query上边使用add()给他再此补充一个FilterQuery
FilterQuery filterQuery = new SimpleFilterQuery();
//这是过滤条件对应的域以及对应的过滤词
Criteria brandCriteria = new Criteria("item_brand").is(searchMap.get("brand"));
//将过滤条件设置到过滤查询中
filterQuery.addCriteria(brandCriteria);
//将过滤查询设置到查询query中
query.addFilterQuery(filterQuery);-
可以针对多个域增加不同的过滤条件
-
-
对动态域的过滤查询,动态与一般在pojo中设置为对应的map集合,因此此处对map集合操作
//对动态域
Map<String, String> specMap = (Map<String, String>) searchMap.get("spec");
for (String key : specMap.keySet()) {
FilterQuery filterQuery = new SimpleFilterQuery();
Criteria specCriteria = new Criteria("item_spec" +key).is(specMap.get(key));
filterQuery.addCriteria(specCriteria);
query.addFilterQuery(filterQuery);
三丶高亮查询
-
代码:
//高亮查询
HighlightQuery query = new SimpleHighlightQuery();
//设置高亮选项
HighlightOptions highlightOptions = new HighlightOptions();
//设置高亮域
highlightOptions.addField("item_title");
//设置高亮前缀高亮后缀
highlightOptions.setSimplePrefix("<em style='color:red'>");
highlightOptions.setSimplePostfix("</em>");
//设置高亮选项
query.setHighlightOptions(highlightOptions);
//********获取高亮结果集********
//高亮页对象
HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class);
//高亮入口集合(每条记录的高亮入口)
List<HighlightEntry<TbItem>> entryList = page.getHighlighted();
for (HighlightEntry<TbItem> entry : entryList) {
//获取高亮列表(高亮域的个数)
List<HighlightEntry.Highlight> highlightList = entry.getHighlights();
for (HighlightEntry.Highlight h : highlightList) {
List<String> sns = h.getSnipplets();//每个域可能存取多值
for (String sn : sns) {
TbItem item = entry.getEntity();//获取原,实体类
item.setTitle(sn);
}
}
}
//设置好之后获取内容
List<集合对象类型> list = page.getContent()
四丶分组查询
Query query = new SimpleQuery("*:*");
//按照关键字查询
Criteria criteria = new Criteria("item_keywords").is(searcpMap.get("keywords"));//where..
query.addCriteria(criteria);
//设置分组选项
GroupOptions groupOptions = new GroupOptions();
groupOptions.addGroupByField("item_category");//group by ....
query.setGroupOptions(groupOptions);
//得到分组页(一个分组页 包含多个分组结果)
GroupPage<TbItem> page = solrTemplate.queryForGroupPage(query, TbItem.class);
//根据列得到分组结果集 在设置分组选项时 可以设置很多的分组列 所以在一处应该根据列名称去挑选对应的分组列
GroupResult<TbItem> groupResult = page.getGroupResult("item_category");
//得到分组结果入口页 (可以得到具体的分组数据 这里是对象)
Page<GroupEntry<TbItem>> groupEntries = groupResult.getGroupEntries();
//得到分组入口集合(数据 这里是集合)
List<GroupEntry<TbItem>> content = groupEntries.getContent();
for (GroupEntry<TbItem> entry : content) {
//字符串为分组数据
String value = entry.getGroupValue()
}
-
此处一般将最后得到的分组数据字符串存入list,返回调用的地方。
-
注意的是:此处的page,getContent()得到的为null,此处做的是一个空实现。