Group分組划分結果,返回的是分組結果;
Facet分組統計,側重統計,返回的是分組后的數量;
一、Group用法:
//組查詢基礎配置
params.set(GroupParams.GROUP, "true");
params.set(GroupParams.GROUP_FIELD, "dkeys");根據dkeys域上的值來分組划分結果,建議dkeys上不要分詞;
params.set(GroupParams.GROUP_LIMIT, "5");
params.set(GroupParams.GROUP_FORMAT, "grouped");
params.set(GroupParams.GROUP_MAIN, "false");
Group查詢結果遍歷方式:
QueryResponse response = solrServer.query(query);
GroupResponse groupResponse = response.getGroupResponse();
List<GroupCommand> ls = groupResponse.getValues();
for(GroupCommand gc:ls){
List<Group> list = gc.getValues();
for(Group g : list){
SolrDocumentList sdl = g.getResult();
if (CollectionUtils.isNotEmpty(sdl)) {
for (SolrDocument doc : sdl) {
System.out.println(doc.toString());//相同的dkeys下的文檔每5個作為一組返回;
}
}
}
}
此時普通遍歷結果的方法無效:
SolrDocumentList results = response.getResults();
System.out.println(ls+"\t\t"+results);//輸出null
二、Facet用法:類似。也有自己獨立的遍歷方式
1 、什么是Faceted Search
Facet['fæsɪt]很難翻譯,只能靠例子來理解了。Solr作者Yonik Seeley也給出更為直接的名字:導航(Guided Navigation)、參數化查詢(Paramatic Search)。
上面是比較直接的Faceted Search例子,品牌、產品特征、賣家,均是 Facet 。而Apple、Lenovo等品牌,就是 Facet values 或者說 Constraints ,而Facet values所帶的統計值就是 Facet count/Constraint count 。
2 、Facet 使用
q = 超級本
facet = true
facet.field = 產品特性
facet.field = 品牌
facet.field = 賣家
http://…/select?q=超級本&facet=true&wt=json
&facet.field=品牌&facet.field=產品特性&facet.field=賣家
也可以提交查詢條件,設置fq(filter query)。
q = 電腦
facet = true
fq = 價格:[8000 TO *]
facet.mincount = 1 // fq將不符合的字段過濾后,會顯示count為0
facet.field = 產品特性
facet.field = 品牌
facet.field = 賣家
http://…/select?q=超級本&facet=true&wt=json
&fq=價格:[8000 TO *]&facet.mincount=1
&facet.field=品牌&facet.field=產品特性&facet.field=賣家
"facet_counts": { "facet_fields": { "品牌": [ "Apple", 4, "Lenovo", 39 …] "產品特性": [ "顯卡", 42, "酷睿", 38 …] …}}
如果用戶選擇了Apple這個分類,查詢條件中需要添加另外一個fq查詢條件,並移除Apple所在的facet.field。
http://…/select?q=超級本&facet=true&wt=json
&fq=價格:[8000 TO *]&fq=品牌:Apple&facet.mincount=1
&facet.field= 品牌&facet.field=產品特性&facet.field=賣家
3 、Facet 參數
facet.prefix – 限制constaints的前綴
facet.mincount=0 – 限制constants count的最小返回值,默認為0
facet.sort=count – 排序的方式,根據count或者index
facet.offset=0 – 表示在當前排序情況下的偏移,可以做分頁
facet.limit=100 – constraints返回的數目
facet.missing=false – 是否返回沒有值的field
facet.date – Deprecated, use facet.range
facet.query
指定一個查詢字符串作為Facet Constraint
facet.query = rank:[* TO 20]
facet.query = rank:[21 TO *]
"facet_counts": { "facet_fields": { "品牌": [ "Apple", 4, "Lenovo", 10 …] "產品特性": [ "顯卡", 11, "酷睿", 20 …] …}}
facet.range
http://…/select?&facet=true
&facet.range=price
&facet.range.start=5000
&facet.range.end=8000
&facet.range.gap=1000(每1000分一組,5000-6000一組,6000-7000一組,7000-8000一組)
<result numFound="27" ... /> ... <lst name="facet_counts"> <lst name="facet_queries"> <int name="rank:[* TO 20]">2</int> <int name="rank:[21 TO *]">15</int> </lst> ...
WARNING: range范圍是左閉右開,[start, end)
facet.pivot
這個是Solr 4.0的新特性,pivot和facet一樣難理解,還是用例子來講吧。
Syntax: facet.pivot=field1,field2,field3...
e.g. facet.pivot=comment_user, grade
#docs |
#docs grade:好 |
#docs 等級:中 |
#docs 等級:差 |
|
comment_user:1 |
10 |
8 |
1 |
1 |
comment_user:2 |
20 |
18 |
2 |
0 |
comment_user:3 |
15 |
12 |
2 |
1 |
comment_user:4 |
18 |
15 |
2 |
1 |
"facet_counts":{ "facet_pivot":{ "comment_user, grade ":[{ "field":"comment_user", "value":"1", "count":10, "pivot":[{ "field":"grade", "value":"好", "count":8}, { "field":"grade", "value":"中", "count":1}, { "field":"grade", "value":"差", "count":1}] }, { "field":" comment_user ", "value":"2", "count":20, "pivot":[{ …
沒有pivot機制的話,要做到上面那點可能需要多次查詢:
http://...q= comment&fq= grade:好&facet=true&facet.field=comment_user
http://...q=comment&fq=grade:中&facet=true&facet.field=comment_user
http://...q=comment&fq=grade:差&facet=true&facet.field=comment_user
Facet.pivot - Computes a Matrix of Constraint Counts across multiple Facet Fields. by Yonik Seeley.
上面那個解釋很不錯,只能理解不能翻譯。
返回查詢集合中指定field的統計情況,例如找到city一樣的文檔數目:
加入文檔
查詢:http://localhost:8983/solr/select? q=name:company&facet=true&facet.field=city&facet.mincount=1
- <add>
- <doc>
- <field name="id">1</field>
- <field name="name">Company 1</field>
- <field name="city">New York</field>
- </doc>
- <doc>
- <field name="id">2</field>
- <field name="name">Company 2</field>
- <field name="city">New Orleans</field>
- </doc>
- <doc>
- <field name="id">3</field>
- <field name="name">Company 3</field>
- <field name="city">New York</field>
- </doc>
- </add>
結果:
- <lst name="facet_fields">
- <lst name="city">
- <int name="New York">2</int>
- <int name="New Orleans">1</int>
- </lst>
- </lst>
獲得指定日期范圍內的文檔 :添加的文檔
查詢語句:分別指定時間的field,開始時間和結束時間,gap指定時間的划分,結果顯示時間區間的數目。
- <add>
- <doc>
- <field name="id">1</field>
- <field name="title">Lucene or Solr ?</field>
- <field name="added">2010-12-06T12:12:12Z</field>
- </doc>
- <doc>
- <field name="id">2</field>
- <field name="title">My Solr and the rest of the world</field>
- <field name="added">2010-12-07T11:11:11Z</field>
- </doc>
- <doc>
- <field name="id">3</field>
- <field name="title">Solr recipes</field>
- <field name="added">2010-11-30T12:12:12Z</field>
- </doc>
- <doc>
- <field name="id">4</field>
- <field name="title">Solr cookbook</field>
- <field name="added">2010-11-29T12:12:12Z</field>
- </doc>
- </add>
http://localhost:8983/solr/select?q=*:*&rows=0&facet=true&facet.date=added&facet.date.start=NOW/DAY-30DAYS&facet.date.end=NOW/DAY&facet.date.gap=+7DAY
結果:
- <int name="2010-11-08T00:00:00Z">0</int>
- <int name="2010-11-15T00:00:00Z">0</int>
- <int name="2010-11-22T00:00:00Z">0</int>
- <int name="2010-11-29T00:00:00Z">2</int>
- <int name="2010-12-06T00:00:00Z">2</int>
得到數值范圍的數目,和時間范圍一樣:
http://localhost:8983/solr/select?q=*:*&rows=0&facet=true&facet.range=price&facet.range.start=0&facet.range.end=400&facet.range.gap=100
自定義區間,而不是連續區間的划分:
http://localhost:8983/solr/select?q=name:car&facet=true&facet.query=price:[10 TO 80]&facet.query=price:[90 TO 300]
移除過濾:
http://localhost:8983/solr/select?q=name:company&facet=true&fq={!tag=stateTag}state:"New York"&facet.field={!ex=stateTag}city&facet.field={!ex=stateTag}state
fq={!tag=stateTag}state:"New York":只顯示state為"New York"的結果。
facet.field={!ex=stateTag}city:移除stateTag的過濾后,在結果集中,對city域進行統計。
命名facet結果集:
http://localhost:8983/solr/select?q=name:company&facet=true&fq={!tag=stateTag}state:Luiziana&facet.field={!key=stateFiltered}city&facet.field={!ex=stateTag key=stateUnfiltered}state
acet.field={!key=stateFiltered}city:命名city為stateFiltered,並按照前面的過濾
對facet結果集進行排序按照字典序排序,默認是按數量排序:
http://localhost:8983/solr/select?q=name:house&facet=true&facet.field=city&facet.sort=index
實現自動提示:前綴為so的都會顯示,一般不需要分詞
http://localhost:8983/solr/select?q=*:*&rows=0&facet=true&facet.field=title_autocomplete&facet.prefix=so
得到某一個域中不含某詞的facet,也可以是不含某個域:
http://localhost:8983/solr/select?q=title:solr&facet=true&facet.query=!price:[* TO *]
指定結果集數目的統計facet:-1表示所有
http://localhost:8983/solr/select?q=title:solr&facet=true&facet.field=category&facet.limit=-1
指定不同域的facet的限制數目:一個沒限制,一個限制10
http://localhost:8983/solr/select?q=name:car&facet=true&facet.field=category&facet.field=manufacturer&f.category.facet.limit=-1&f.manufacturer.face