Solr中Facet用法和Group用法


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)。

image

上面是比較直接的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一樣的文檔數目

加入文檔

[plain]  view plain copy
  1. <add>  
  2. <doc>  
  3. <field name="id">1</field>  
  4. <field name="name">Company 1</field>  
  5. <field name="city">New York</field>  
  6. </doc>  
  7. <doc>  
  8. <field name="id">2</field>  
  9. <field name="name">Company 2</field>  
  10. <field name="city">New Orleans</field>  
  11. </doc>  
  12. <doc>  
  13. <field name="id">3</field>  
  14. <field name="name">Company 3</field>  
  15. <field name="city">New York</field>  
  16. </doc>  
  17. </add>  
查詢:http://localhost:8983/solr/select? q=name:company&facet=true&facet.field=city&facet.mincount=1

結果:

[plain]  view plain copy
  1. <lst name="facet_fields">  
  2. <lst name="city">  
  3. <int name="New York">2</int>  
  4. <int name="New Orleans">1</int>  
  5. </lst>  
  6. </lst>  


獲得指定日期范圍內的文檔 :添加的文檔
[plain]  view plain copy
  1. <add>  
  2. <doc>  
  3. <field name="id">1</field>  
  4. <field name="title">Lucene or Solr ?</field>  
  5. <field name="added">2010-12-06T12:12:12Z</field>  
  6. </doc>  
  7. <doc>  
  8. <field name="id">2</field>  
  9. <field name="title">My Solr and the rest of the world</field>  
  10. <field name="added">2010-12-07T11:11:11Z</field>  
  11. </doc>  
  12. <doc>  
  13. <field name="id">3</field>  
  14. <field name="title">Solr recipes</field>  
  15. <field name="added">2010-11-30T12:12:12Z</field>  
  16. </doc>  
  17. <doc>  
  18. <field name="id">4</field>  
  19. <field name="title">Solr cookbook</field>  
  20. <field name="added">2010-11-29T12:12:12Z</field>  
  21. </doc>  
  22. </add>  
查詢語句:分別指定時間的field,開始時間和結束時間,gap指定時間的划分,結果顯示時間區間的數目。

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

結果:

[html]  view plain copy
  1. <int name="2010-11-08T00:00:00Z">0</int>  
  2. <int name="2010-11-15T00:00:00Z">0</int>  
  3. <int name="2010-11-22T00:00:00Z">0</int>  
  4. <int name="2010-11-29T00:00:00Z">2</int>  
  5. <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




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM