官术网_书友最值得收藏!

11.4 Solr Subfacet

Solr中的Subfacet又稱為Nested Facet(嵌套Facet)。它是Solr Pivot Facet的升級版,它允許你為父Facet生成的每個bucket添加額外的子Facet。Subfacet相比Pivot Facet有以下幾點優(yōu)勢:

?Subfacet使用Facet Function(Facet函數(shù))來進行統(tǒng)計,具有強大的實時分析能力;

??可以將一個Subfacet(子Facet)嵌套到任意的Facet類型(比如Field、Query、Range)中;

??一個Subfacet(子Facet)可以是任意的Facet類型(比如Field、Query、Range);

??一個給定的Facet可以嵌套多個Subfacet(子Facet);

??就像頂級Facet一樣,每個Subfacet(子Facet)可以擁有它自己單獨的配置(比如offset、limit、sort、stats等)。

11.4.1 Subfacet語法

Subfacet是新Facet功能模塊中的一部分,采用JSON Facet API形式進行表示。每個Facet命令其實就是一個Subfacet。因為每個主查詢或Flter Query匹配的索引文檔都會隱式的定義一個頂級的Facet Bucket,你可以簡單地通過聲明Facet命令參數(shù)來添加一個Facet,比如在“genre”域上簡單的添加一個“terms”類型的Facet,示例如下所示:

        top_genres:{
            type: terms,
            field: genre,
            limit: 5
        }

如果你想要在genre這個Facet基礎上再添加一個SubFacet來返回前4名作者,那么可以這樣定義:

        top_genres:{
            type: terms,
            field: genre,
            limit: 5,
            facet:{
              top_authors:{
                type: terms,
                field: author,
                limit: 4
              }
            }
        }

11.4.2 Subfacet復雜示例

假設你想要執(zhí)行類似下面這樣的復雜Facet查詢:

??首先你想要按照genre域進行Facet統(tǒng)計;

??在genre域Facet基礎之上再按照author域進行Facet統(tǒng)計,每個author子Facet內返回前7名作者;

??同時還要在genre域Facet基礎之上創(chuàng)建一個“highpop”(即高人氣的意思)的Facet進行統(tǒng)計popularity人氣指數(shù)在[8-10]之間的作者;

??最后在每個“highpop”Facet基礎之上再創(chuàng)建一個“publisher”Facet進行統(tǒng)計,返回高人氣作者中的前5名所屬出版社。

簡而言之,你想要統(tǒng)計每個書籍分類下前7名作者,同時統(tǒng)計每個書籍分類下暢銷書(高人氣的書即表示該書暢銷)中的前5名所屬出版社。

使用JSON Facet API來表示以上的Facet查詢,可以如下所示:

          json.facet=
          {
              top_genres:{
                  type: terms,
                  field: genre,
                  facet:{
                      top_authors: {
                            type : terms,
                            field: author,
                            limit: 7
                      },
                      highpop:{
                            type : query,
                            q: "popularity:[8 TO 10]",
                            facet:{
                                publishers:{
                                    type: terms,
                                    field: publisher,
                                    limit: 5
                                }
                            }
                      }
                  }
              }
          }

Subfacet查詢返回的數(shù)據(jù)都是按照統(tǒng)計后得到的數(shù)字從高到低排序,如果你想要改變這種默認排序方式,比如將每個書籍分類下的TOP N作者按照該書的銷量域(假定我們有個"sales"域表示書籍的銷量)從高到低進行排序,此時你可以簡單地將前面的查詢示例進行調整,如下所示:

          top_authors:{
              type: terms,
              field: author,
              limit: 7,
              sort: "revenue desc",
              facet:{
                revenue: "sum(sales)"
              }
              // 其他部分省略
          }

Subfacet的類型type前面我們已經(jīng)演示了terms(即簡單地按照域進行Facet)和query(即各種Query),此外我們還可以對range(即區(qū)間范圍Query)創(chuàng)建Facet來統(tǒng)計,示例如下所示:

          json.facet=sales:{
              type:range,
              field:date_add,
              start:'2016-05-31T22:00:00Z',
              end:'2016-10-31T22:59:59Z',
              gap:'+1DAY',
              facet:{
                  ordersSum:'sum(sales_value)'
              }
          }

此時你可能會有疑問:JSON Facet API這種方式如何設置請求參數(shù),其實很簡單,json. facet是固定的參數(shù)key,后面的整段JSON字符串就是參數(shù)value。如果是直接將URL輸入到瀏覽器地址里進行測試,你可以先直接拼接上

          http://localhost:8080/solr/yourcore/select? q=*:*&json.facet=。。。。。。

如果你想要使用SolrJ來發(fā)送JSON Facet這種格式的參數(shù),你可以類似這樣編碼,如下所示:

          ModifiableSolrParams params = new ModifiableSolrParams();
          params.add("json.facet", "這里是json字符串。");
          params.set("wt", wt);
          params.set("indent", "true");
          QueryRequest query = new QueryRequest(params);
          query.setResponseParser(new XXXXXXResponseParser("json"));
          NamedList<Object> rsp = solrClient.request(query);
          String raw = (String)rsp.get("response");

通過上面的示例,我想你已經(jīng)感覺到了Subfacet的強大,Subfacet支持對域、任意查詢,任意區(qū)間進行統(tǒng)計,同時還支持Facet任意深度的嵌套,但是,F(xiàn)acet嵌套是Pivot Facet的問題所在。Subfacet還支持對統(tǒng)計結果進行多種排序,比如sum(sales) desc對指定域求和然后從高到低排序,然而普通Facet僅僅支持index和count兩種排序方式,而且還不支持反轉排序。總而言之,Subfacet的出現(xiàn)徹底打破了這種僵局。

主站蜘蛛池模板: 聊城市| 石家庄市| 京山县| 上杭县| 隆昌县| 潜江市| 临澧县| 台中县| 新宁县| 腾冲县| 南丹县| 秦安县| 淅川县| 蓬莱市| 安西县| 霍山县| 宣化县| 新沂市| 漳平市| 汝阳县| 凤翔县| 东兰县| 临安市| 镇江市| 沂南县| 杭锦后旗| 桃源县| 山丹县| 壶关县| 承德县| 策勒县| 微山县| 巴东县| 德昌县| 策勒县| 威远县| 峨边| 嵊泗县| 宁夏| 扬州市| 光山县|