1、基本定義理解
Facet是根據field來進行分組統計,可以得出所有指定Field的統計結果,具體有哪些參數配置,參考:https://blog.csdn.net/weixin_43231076/article/details/102685185
FacetPivot與Facet的功能很相似,但是它可以指定多個field,也就是多個維度來分組統計,並且統計出來的結果可以整理成Tree的結構
2、代碼實戰舉例
2-1、定義實體類:
import org.apache.solr.client.solrj.beans.Field;
public class Product implements Serializable{
private static final long serialVersionUID = 7300743141456692472L;
@Field
private String id;
@Field
private String title_s;
@Field
private String major_s;
@Field
private String subMajor_s;
@Field
private String brand_s;
@Field
private String model_s;
@Field
private int price_i;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMajor_s() {
return major_s;
}
public void setMajor_s(String major_s) {
this.major_s = major_s;
}
public String getSubMajor_s() {
return subMajor_s;
}
public void setSubMajor_s(String subMajor_s) {
this.subMajor_s = subMajor_s;
}
public String getBrand_s() {
return brand_s;
}
public void setBrand_s(String brand_s) {
this.brand_s = brand_s;
}
public String getModel_s() {
return model_s;
}
public void setModel_s(String model_s) {
this.model_s = model_s;
}
public int getPrice_i() {
return price_i;
}
public void setPrice_i(int price_i) {
this.price_i = price_i;
}
public String getTitle_s() {
return title_s;
}
public void setTitle_s(String title_s) {
this.title_s = title_s;
}
}
2-2、插入測試數據
private static void addIndex() throws Exception{
HttpSolrClient client = SolrServer.getSolrClient();
List<Product> list = new ArrayList<>();
Product product1 = new Product();
product1.setId("1001");
product1.setTitle_s("SAST/先科 32英寸液晶空調");
product1.setMajor_s("家用電器");
product1.setSubMajor_s("空調");
product1.setBrand_s("先科");
product1.setModel_s("SAST");
product1.setPrice_i(6500);
list.add(product1);
Product product2 = new Product();
product2.setId("1002");
product2.setTitle_s("創維55M1 55英寸4K高清洗衣機");
product2.setMajor_s("家用電器");
product2.setSubMajor_s("洗衣機");
product2.setBrand_s("創維");
product2.setModel_s("55M1");
product2.setPrice_i(2999);
list.add(product2);
Product product3 = new Product();
product3.setId("1003");
product3.setTitle_s("Hisense/海信HZ55E3D-PRO 空調");
product3.setMajor_s("家用電器");
product3.setSubMajor_s("電視");
product3.setBrand_s("海信");
product3.setModel_s("HZ55E3D-PRO");
product3.setPrice_i(5642);
list.add(product3);
Product product4 = new Product();
product4.setId("1004");
product4.setTitle_s("創維5T 65英寸4K全面屏電視機智能網絡wifi平板液晶屏家用彩電 55");
product4.setMajor_s("家用電器");
product4.setSubMajor_s("電視");
product4.setBrand_s("創維");
product4.setModel_s("創維5T");
product4.setPrice_i(9999);
list.add(product4);
Product product5 = new Product();
product5.setId("1005");
product5.setTitle_s("Changhong/長虹 65A4U 65英寸電視機4K智能網絡平板液晶屏LED彩電");
product5.setMajor_s("家用電器");
product5.setSubMajor_s("電視");
product5.setBrand_s("長虹");
product5.setModel_s("65A4U");
product5.setPrice_i(1999);
list.add(product5);
client.addBeans(list);
client.commit();
System.out.println("插入數據成功...");
}
public static void main(String[] args) throws Exception{
addIndex();
}
2-3、測試數據插入成功後,solr查詢結果如下:
2-4、Facet功能測試
public static void queryFacet() throws Exception{
HttpSolrClient client = SolrServer.getSolrClient();
SolrQuery sQuery = new SolrQuery();
String para = "*:*"; //查詢全部數據
sQuery.setFacet(true); //打開Facet查詢開關
sQuery.addFacetField(new String[] {"subMajor_s", "brand_s"}); //添加要進行facet操作
sQuery.setFacetLimit(100); //限制Facet的返回數量
sQuery.setFacetMissing(false); //false:表示不統計null的值
sQuery.setFacetMinCount(1); //分組的最小數據爲1
sQuery.addFacetQuery("price_i:[3000 TO 10000]"); //增加facet的查詢條件
sQuery.setQuery(para);
QueryResponse queryResponse;
queryResponse = client.query(sQuery);
List<FacetField> facets = queryResponse.getFacetFields();// 返回的facet列表
if(facets != null && facets.size() > 0) {
for(FacetField facet : facets) {
System.out.println(facet.getName() + "====" + facet.getGap() + "====" + facet.getValueCount());
System.out.println("------------------");
List<Count> counts = facet.getValues();
for(int i=0; i<counts.size(); i++) {
Count count = counts.get(i);
System.out.println(count.getName() + "====" + count.getCount() + "====" + count.getAsFilterQuery());
System.out.println();
}
}
}
}
運行結果:
subMajor_s====null====3
------------------
電視====3====subMajor_s:電視
洗衣機====1====subMajor_s:洗衣機
空調====1====subMajor_s:空調
brand_s====null====4
------------------
創維====2====brand_s:創維
先科====1====brand_s:先科
海信====1====brand_s:海信
由這個結果可以看出,統計結果是根據subMajor_s和brand_s兩個Field分組進行統計數量
2-5、FacetPivot測試
private static void queryFacetPivot() throws Exception{
HttpSolrClient client = SolrServer.getSolrClient();
SolrQuery sQuery = new SolrQuery();
String para = "*:*";
sQuery.setFacet(true); //打開Facet功能
sQuery.add("facet.pivot", "major_s,subMajor_s,brand_s"); //添加FacetPivot Field,使用三個維度來分組查詢,多個field之間用逗號隔開,注意中間不能使用空格
sQuery.setFacetLimit(1000); //限制Facet的返回數量
sQuery.setQuery(para);
//查詢數據,並且設置請求方式爲POST,因爲如果sQuest的參數過長的話,使用GET請求會出現參數過長的情況
QueryResponse queryResponse = client.query(sQuery, SolrRequest.METHOD.POST);
/**
* NamedList,一個有序的name/value容器,NamedList不像Map,他具有以下特點:
1、名字可以重複
2、NamedList中的element保持這有序狀態
3、可以下標的形式訪問Elements
4、name和value都可以爲null
*/
NamedList<List<PivotField>> namedList = queryResponse.getFacetPivot();
System.out.println(namedList);
if(namedList != null) {
for(int i=0; i<namedList.size(); i++) {
List<PivotField> pivotList = namedList.getVal(i);
if(pivotList != null) {
for(PivotField privoField : pivotList) {
System.out.println("一級====" + privoField.getValue() + "====" + privoField.getCount());
List<PivotField> fieldList = privoField.getPivot();
if(fieldList != null) {
for(PivotField item : fieldList) {
System.out.println("二級====" + item.getValue() + "====" + item.getCount());
List<PivotField> fieldList1 = item.getPivot();
if(fieldList1 != null) {
for(PivotField item1 : fieldList1) {
System.out.println("三級====" + item1.getValue() + "====" + item1.getCount());
}
}
}
}
}
}
}
}
}
運行結果:
{major_s,subMajor_s,brand_s=[major_s:家用電器 [5] [subMajor_s:電視 [3] [brand_s:創維 [1] null, brand_s:海信 [1] null, brand_s:長虹 [1] null], subMajor_s:洗衣機 [1] [brand_s:創維 [1] null], subMajor_s:空調 [1] [brand_s:先科 [1] null]]]}
一級====家用電器====5
二級====電視====3
三級====創維====1
三級====海信====1
三級====長虹====1
二級====洗衣機====1
三級====創維====1
二級====空調====1
三級====先科====1
由此結果可看出:
FacetPivot不僅可以爲每一個Field統計數量,並且可以將統計的結果整理成Tree型結構