欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Data Solr 查询方法

程序员文章站 2023-12-22 21:31:46
...

Spring Data Solr 查询方法

一丶普通关键字查询(代码)

  		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,此处做的是一个空实现。

上一篇:

下一篇: