Solr---Group分組查詢


場景描述:

        普通查詢時,查詢的結果中,個人信息有很多重復的,按照業務需求需要將重復的個人信息隱藏,所以使用分組查詢,如果想查看隱藏的部分,則在具體分組中繼續使用分頁的查詢。

分組查詢:

JAVA部分代碼:

  1. ...
  2.         // 創建solrQuery對象
  3. SolrQuery query = new SolrQuery();
  4. query.set("q", "*:*" );
  5. /*分組*/
  6. //是否分組
  7. query.setParam("group", true);
  8. //分組的字段,不可以是多值字段
  9. query.setParam("group.field", "PAT_ID");
  10. //分組中每個組的上限數量,默認為1
  11. query.setParam("group.limit","2");
  12. //分布式模式使用分組,並返回分組數量
  13. query.setParam("group.ngroups","true");
  14. // 設置start,開始的組
  15. query.setStart(0);
  16. // 設置rows,返回多少組
  17. query.setRows(10);
  18. // 執行搜索,返回response對象
  19. QueryResponse rq = cloudSolrClient.query(query);
  20. // 從response中獲取想要的結果,因為結構與正常搜索的結構不一致,所以取數據時與普通搜索獲取數據不一樣
  21. GroupResponse groupResponse = rq.getGroupResponse();
  22. List <GroupCommand> groupCommandList = groupResponse.getValues();
  23. SolrDocumentList solrDocumentList = new SolrDocumentList();
  24. long count = 0;
  25. long groupNum=0;
  26. // 判斷是否為空
  27. if(groupCommandList!=null && groupCommandList.size()>0){
  28. // 匹配出的結果總數
  29. count = groupCommandList.get(0).getMatches();
  30. // 分組總數
  31. groupNum = groupCommandList.get(0).getNGroups();
  32. List <Group> groupList=groupCommandList.get(0).getValues();
  33. // 遍歷返回的每個分組
  34. for(Group group:groupList){
  35. // 若為普通搜索的結果則只有一條;若為分組詳情則只有一組,將一組全部放入
  36. for(SolrDocument solrDocument:group.getResult()){
  37. // 將分組中的數放入最后一個參數
  38. solrDocument.addField("numFound",group.getResult().getNumFound());
  39. // 每個分組只取第一個
  40. solrDocumentList.add(solrDocument);
  41. }
  42. }
  43. }
  44.         ...

        查詢結果在solrDocumentList中,處理成什么格式可以自己設置;groupNum為分組的組數,count為所有匹配的文檔數(不分組的匹配數);

Solr管理頁面查詢的結構如下:

分組中的分頁:

JAVA部分代碼:

  1. //分組中的偏移量,相當於普通搜索中的start
  2. query.setParam("group.offset",String.valueOf(map.get("groupOffset")));
  3. //分組中每個組的上限數量,相當於普通搜索中的每頁數量rows,默認為1
  4. query.setParam("group.limit",String.valueOf(map.get("groupLimit")));
        配合這兩個條件,進行分組中的分頁。
 
《Solr實戰》中這樣寫道:
  1. 結果分組功能在分布式模式下不能完全起作用。
  2. 如果計划在分布式模式下使用Solr的分組功能,並需要得到精確的分組數量(由group.ngroups=true參數返回)。
  3. 如果沒有按照計划那樣,將數據按照分組的字段分割到各個分片上,那返回的分組數量僅僅是一個上限值。解決辦法是
  4. 自定義散列,就是設置一個id讓指定的一組文檔分發到同一個分片上,這樣做最大的問題是會造成集群里分片的不均衡。
        經過多次測試,發現並沒有發生文章中說的那樣的問題。而且在嘗試設置自定義散列的時候不知道該如何設置,起初我在配置文件中設置,但是沒有效果。網上也沒人設置過,沒有出現上述問題,也就不再關心這個自定義散列了。

對於分組的參數,官網也有提及,如下:
下面是別人翻譯過來的:

地址:https://blog.csdn.net/jiangchao858/article/details/63256048

 

參數 類型 說明
group 布爾值 設為true,表示結果需要分組
group.field 字符串 需要分組的字段,字段類型需要時是StrField或TextField
group.func 查詢語句 可以指定查詢函數
group.query 查詢語句 可以指定查詢語句
rows 整數 返回多少組結果,默認10
start 整數 指定結果開始位置/偏移量
group.limit 整數 每組返回多數條結果,默認1
group.offset 整數 指定每組結果開始位置/偏移量
sort 排序算法 控制各個組的返回順序
group.sort 排序算法 控制每一分組內部的順序
group.format grouped/simple 設置為simple可以使得結果以單一列表形式返回
group.main 布爾值 設為true時,結果將主要由第一個字段的分組命令決定
group.ngroups 布爾值 設為true時,Solr將返回分組數量,默認fasle
group.truncate 布爾值 設為true時,facet數量將基於group分組中匹相關性高的文檔,默認fasle
group.cache.percent 整數0-100 設為大於0時,表示緩存結果,默認為0。該項對於布爾查詢,通配符查詢,模糊查詢有改善,卻會減慢普通詞查詢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM