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