場景描述:
普通查詢時,查詢的結果中,個人信息有很多重復的,按照業務需求需要將重復的個人信息隱藏,所以使用分組查詢,如果想查看隱藏的部分,則在具體分組中繼續使用分頁的查詢。
分組查詢:
JAVA部分代碼:
-
...
-
// 創建solrQuery對象
-
SolrQuery query = new SolrQuery();
-
query.set("q", "*:*" );
-
/*分組*/
-
//是否分組
-
query.setParam("group", true);
-
//分組的字段,不可以是多值字段
-
query.setParam("group.field", "PAT_ID");
-
//分組中每個組的上限數量,默認為1
-
query.setParam("group.limit","2");
-
//分布式模式使用分組,並返回分組數量
-
query.setParam("group.ngroups","true");
-
// 設置start,開始的組
-
query.setStart(0);
-
// 設置rows,返回多少組
-
query.setRows(10);
-
// 執行搜索,返回response對象
-
QueryResponse rq = cloudSolrClient.query(query);
-
// 從response中獲取想要的結果,因為結構與正常搜索的結構不一致,所以取數據時與普通搜索獲取數據不一樣
-
GroupResponse groupResponse = rq.getGroupResponse();
-
List <GroupCommand> groupCommandList = groupResponse.getValues();
-
SolrDocumentList solrDocumentList = new SolrDocumentList();
-
long count = 0;
-
long groupNum=0;
-
// 判斷是否為空
-
if(groupCommandList!=null && groupCommandList.size()>0){
-
// 匹配出的結果總數
-
count = groupCommandList.get(0).getMatches();
-
// 分組總數
-
groupNum = groupCommandList.get(0).getNGroups();
-
List <Group> groupList=groupCommandList.get(0).getValues();
-
// 遍歷返回的每個分組
-
for(Group group:groupList){
-
// 若為普通搜索的結果則只有一條;若為分組詳情則只有一組,將一組全部放入
-
for(SolrDocument solrDocument:group.getResult()){
-
// 將分組中的數放入最后一個參數
-
solrDocument.addField("numFound",group.getResult().getNumFound());
-
// 每個分組只取第一個
-
solrDocumentList.add(solrDocument);
-
}
-
}
-
}
-
...
查詢結果在solrDocumentList中,處理成什么格式可以自己設置;groupNum為分組的組數,count為所有匹配的文檔數(不分組的匹配數);
Solr管理頁面查詢的結構如下:
分組中的分頁:
JAVA部分代碼:
-
//分組中的偏移量,相當於普通搜索中的start
-
query.setParam("group.offset",String.valueOf(map.get("groupOffset")));
-
//分組中每個組的上限數量,相當於普通搜索中的每頁數量rows,默認為1
-
query.setParam("group.limit",String.valueOf(map.get("groupLimit")));
《Solr實戰》中這樣寫道:
-
結果分組功能在分布式模式下不能完全起作用。
-
如果計划在分布式模式下使用Solr的分組功能,並需要得到精確的分組數量(由group.ngroups=true參數返回)。
-
如果沒有按照計划那樣,將數據按照分組的字段分割到各個分片上,那返回的分組數量僅僅是一個上限值。解決辦法是
-
自定義散列,就是設置一個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。該項對於布爾查詢,通配符查詢,模糊查詢有改善,卻會減慢普通詞查詢。 |
