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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM