跟你们一样,网上找了一大堆,结果要么报错要么死循环不知所以,于是放弃了,自己写一手
facet:就是图上的左侧红框
SolrQuery solrQuery = new SolrQuery();
clCategoryOne和sbCategoryOne是我要查询的两个分类
solrQuery.setFacet(true);
solrQuery.addFacetField("clCategoryOne");
solrQuery.addFacetField("sbCategoryOne");
解析这个分类
List<FacetField> filed = queryResponse.getFacetFields();
for (FacetField f : queryResponse.getFacetFields()) {
System.out.println("name1:" + f.getName() + " | value1:" + f.getValueCount()+" | values: "+f.getValues()+" | class: "+f.getClass());
}
结果如图:
image.png
name1:clCategoryOne | value1:2 | values: [哲学、宗教 (1), 马克思主义、列宁主义、毛泽东思想、邓小平理论 (1)] | class: class org.apache.solr.client.solrj.response.FacetField
name1:sbCategoryOne | value1:2 | values: [数学 (1), 英语 (1)] | class: class org.apache.solr.client.solrj.response.FacetField
然后根据这个结论可写出如下完整逻辑:
//获取分类
List<FacetField> filed = queryResponse.getFacetFields();
Map<String,Object> filedMap = new HashMap<>();
for (FacetField f : queryResponse.getFacetFields()) {
System.out.println("name1:" + f.getName() + " | value1:" + f.getValueCount()+" | values: "+f.getValues()+" | class: "+f.getClass());
List<FacetField.Count> countList = f.getValues();
List<String> filedList = new ArrayList<>();
for(int i=0;i<countList.size();i++){
System.out.println("1:" + countList.get(i).getName() + " | 2:" + countList.get(i).getAsFilterQuery()+" | 3: "+countList.get(i).getCount()+" | 4: "+countList.get(i).getFacetField());
String num = Long.toString(countList.get(i).getCount());
String named = countList.get(i).getName() + " " + num;
filedList.add(named);
}
filedMap.put(f.getName()+" "+f.getValueCount(),filedList);
}
res.put("filed",filedMap);
res.put("page",page);
return Result.OK(res);
本文至此已经完成基本教学,因个人代码的特殊性,存在多级分类,所以封装了一手,看得懂的可以借鉴一下以下代码块:
控制器模块:
//获取分类
solrQuery.setFacet(true);
//默认初始值 clCategory-中图分类初始值,clCategorySub中图分类下级初始值;sbCategory学科分类初始值,sbCategorySub-学科分类下级初始值
String clCategory = "clCategoryOne";
String clCategorySub = "clCategoryTwo";
String sbCategory = "sbCategoryOne";
String sbCategorySub = "sbCategoryTwo";
if( null != bookSolrEntity.getClCategoryOne() || "" != bookSolrEntity.getClCategoryOne()){
clCategory = "clCategoryOne";
clCategorySub = "clCategoryTwo";
}else if( null != bookSolrEntity.getClCategoryTwo() || "" != bookSolrEntity.getClCategoryTwo()){
clCategory = "clCategoryTwo";
clCategorySub = "clCategoryThree";
}else if( null != bookSolrEntity.getClCategoryThree() || "" != bookSolrEntity.getClCategoryThree()){
clCategory = "clCategoryThree";
clCategorySub = "clCategoryfour";
}else if( null != bookSolrEntity.getClCategoryFour() || "" != bookSolrEntity.getClCategoryFour()){
clCategory = "clCategoryThree";
clCategorySub = "clCategoryfour";
}
if( null != bookSolrEntity.getSbCategoryOne() || "" != bookSolrEntity.getSbCategoryOne()){
sbCategory = "sbCategoryOne";
sbCategorySub = "sbCategoryTwo";
}else if( null != bookSolrEntity.getSbCategoryTwo() || "" != bookSolrEntity.getSbCategoryTwo()){
sbCategory = "sbCategoryTwo";
sbCategorySub = "sbCategoryThree";
}else if( null != bookSolrEntity.getSbCategoryThree() || "" != bookSolrEntity.getSbCategoryThree()){
sbCategory = "sbCategoryThree";
sbCategorySub = "sbCategoryfour";
}else if( null != bookSolrEntity.getSbCategoryFour() || "" != bookSolrEntity.getSbCategoryFour()){
sbCategory = "sbCategoryThree";
sbCategorySub = "sbCategoryfour";
}
solrQuery.addFacetField(clCategory);
solrQuery.addFacetField(sbCategory);
分类逻辑处理:
//获取分类
List<FacetField> filed = queryResponse.getFacetFields();
List<DjSolrSeachrDto> filedData= new ArrayList<>();
// Map<String,Object> filedMap = new HashMap<>();
for (FacetField f : queryResponse.getFacetFields()) {
DjSolrSeachrDto djSolrSeachrDtolei = new DjSolrSeachrDto();
//System.out.println("name1:" + f.getName() + " | value1:" + f.getValueCount()+" | values: "+f.getValues()+" | class: "+f.getClass());
List<FacetField.Count> countList = f.getValues();
List<DjSolrSeachrDto> filedList = new ArrayList<>();
DjSolrSeachrDto djSolrSeachrDto = new DjSolrSeachrDto();
for(int i=0;i<countList.size();i++){
//System.out.println("1:" + countList.get(i).getName() + " | 2:" + countList.get(i).getAsFilterQuery()+" | 3: "+countList.get(i).getCount()+" | 4: "+countList.get(i).getFacetField());
djSolrSeachrDto = new DjSolrSeachrDto();
String num = Long.toString(countList.get(i).getCount());
String str = countList.get(i).getAsFilterQuery();
str = str.substring(0,str.indexOf(":"));
if(str.equals(sbCategory)){
djSolrSeachrDto.setCatKeys(sbCategorySub);
}else if(str.equals(clCategory)){
djSolrSeachrDto.setCatKeys(clCategorySub);
}
djSolrSeachrDto.setCatName(countList.get(i).getName());
djSolrSeachrDto.setCatNum(num);
filedList.add(djSolrSeachrDto);
}
if(f.getName().equals(sbCategory)){
djSolrSeachrDtolei.setCatKeys(sbCategory);
}else if(f.getName().equals(clCategory)){
djSolrSeachrDtolei.setCatKeys(clCategory);
}
djSolrSeachrDtolei.setCatName(f.getName());
djSolrSeachrDtolei.setCatNum(Integer.toString(f.getValueCount()));
djSolrSeachrDtolei.setCatList(filedList);
filedData.add(djSolrSeachrDtolei);
// filedMap.put(f.getName()+" "+f.getValueCount(),filedList);
}
// res.put("filed",filedMap);
res.put("fileData",filedData);
Dto模块
package org.jeecg.modules.webapi.pc.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @Description: dj_book
* @Author: jeecg-boot
* @Date: 2021-10-28
* @Version: V1.0
*/
@Data
@Accessors(chain = true)
@ApiModel(value="dj_book_dto", description="图书分类出版社查询参数传递")
public class DjSolrSeachrDto implements Serializable {
/**分类key*/
@ApiModelProperty(value = "分类key")
private String catKeys;
/**分类名字*/
@ApiModelProperty(value = "分类名字")
private String catName;
/**结果数量*/
@ApiModelProperty(value = "结果数量")
private String catNum;
/**分类Id数组*/
private java.util.List catList;
/**分类leve*/
@ApiModelProperty(value = "分类leve")
private String leve;
}










网友评论