- Solr權威指南(下卷)
- 蘭小偉
- 1243字
- 2019-01-03 15:33:41
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)徹底打破了這種僵局。
- Java范例大全
- Learning ROS for Robotics Programming(Second Edition)
- ASP.NET MVC4框架揭秘
- Mastering ServiceStack
- 算法大爆炸:面試通關步步為營
- 前端架構:從入門到微前端
- Scala謎題
- Python之光:Python編程入門與實戰(zhàn)
- Visual Basic程序設計上機實驗教程
- Red Hat Enterprise Linux Troubleshooting Guide
- Hadoop大數(shù)據(jù)分析技術
- Backbone.js Testing
- iOS開發(fā)項目化入門教程
- Java高手是怎樣煉成的:原理、方法與實踐
- INSTANT Lift Web Applications How-to