1. 程式人生 > >Solr Facet 統計查詢

Solr Facet 統計查詢

Solr Facet查詢

一)概述

        Facet是solr的高階搜尋功能之一,可以給使用者提供更友好的搜尋體驗.在搜尋關鍵字的同時,能夠按照Facet的欄位進行分組並統計。例如下圖所示,你上淘寶,輸入“電腦”進行搜尋,就會出現品牌分類,價格範圍等分類,這個就叫Facet。



 

二)Solr Facet型別 

Solr提供了4種類型的Fact

[java] view plain copy print?
  1. <lst name="facet_counts">  
  2.   <lst name="facet_queries"/>  
  3.   <lst name="facet_fields"
    />  
  4.   <lst name="facet_dates"/>  
  5.   <lst name="facet_ranges"/>  
  6. </lst>  
<lst name="facet_counts">
  <lst name="facet_queries"/>
  <lst name="facet_fields"/>
  <lst name="facet_dates"/>
  <lst name="facet_ranges"/>
</lst>
    1. facet_queries:代表自定義條件查詢facet,類似資料庫的count函式
    2. facet_fields    :代表根據欄位分組查詢,類似資料庫的group by count的組合
    3. facet_dates :根據日期區間分組查詢
    4. facet_ranges:當然了,日期有區間,數字也有,這個就是根據數字分組查詢

三)Solr Facet元件 

         Solr的預設requestHandler已經包含了Facet元件(solr.FacetComponent).如果自定義requestHandler或者對預設的requestHandler自定義元件列表,那麼需要將Facet加入到元件列表中去.

四)facet query

       Facet Query 使用者自定義條件查詢facet,他提供了非常靈活的Facet.通過facet.query引數,可以對任意欄位進行篩選.下面通過例項來闡述。基本上他的用法,都會在我例項中體現出來

例一:日期區間查詢

[java] view plain copy print?
  1. &facet=true
  2. &facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]  
  3. &facet.query=date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]  
&facet=true
&facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]
&facet.query=date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]

    返回結果如下:

[java] view plain copy print?
  1. <lst name="facet_counts">  
  2.     <lst name="facet_queries">  
  3.         <int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int>  
  4.                 <int name="date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]">3</int>  
  5. </lst>  
  6.     <lst name="facet_fields"/>  
  7.     <lst name="facet_dates"/>  
  8. </lst>  
<lst name="facet_counts">
	<lst name="facet_queries">
		<int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int>
                <int name="date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]">3</int>
</lst>
	<lst name="facet_fields"/>
	<lst name="facet_dates"/>
</lst>

例2:數字區間統計

[java] view plain copy print?
  1. &facet=on  
  2. &facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]  
  3. &facet.query=price:[* TO 5000]  
&facet=on
&facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]
&facet.query=price:[* TO 5000]

 返回結果

[java] view plain copy print?
  1. <lst name="facet_counts">  
  2.     <lst name="facet_queries">  
  3.         <int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int>  
  4.                 <int name="price:[* TO 5000]">116</int>  
  5. </lst>  
  6.     <lst name="facet_fields"/>  
  7.     <lst name="facet_dates"/>  
  8. </lst>  
<lst name="facet_counts">
	<lst name="facet_queries">
		<int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int>
                <int name="price:[* TO 5000]">116</int>
</lst>
	<lst name="facet_fields"/>
	<lst name="facet_dates"/>
</lst>

 例3:自定義條件

[java] view plain copy print?
  1. &facet=true
  2. &facet.query=brand:聯想 AND price:1100
&facet=true
&facet.query=brand:聯想 AND price:1100

 返回結果

[java] view plain copy print?
  1. "facet_counts":{  
  2.     "facet_queries":{  
  3.       "brand:聯想 AND price:1100":1},  
  4.     "facet_fields":{},  
  5.     "facet_dates":{},  
  6.     "facet_ranges":{}}}  
"facet_counts":{
    "facet_queries":{
      "brand:聯想 AND price:1100":1},
    "facet_fields":{},
    "facet_dates":{},
    "facet_ranges":{}}}

五)Field Facet

       Facet欄位通過在請求中加入facet.field引數加以宣告,如果需要對多個欄位進行Facet查詢,那麼將該引數宣告多次.這就是類似於資料庫的group by 加上count的功能,非常的靈活。

例項一:最簡單的field facet

[java] view plain copy print?
  1. &facet=true
  2. &facet.field=brand  
  3. &facet.field=price  
&facet=true
&facet.field=brand
&facet.field=price

 返回結果如下

[java] view plain copy print?
  1. "facet_counts":{  
  2.     "facet_queries":{},  
  3.     "facet_fields":{  
  4.       "brand":[  
  5.         "蘋果",4,  
  6.         "聯想",3,  
  7.         "惠普",2],  
  8.       "price":[  
  9.         "1100.0",2,  
  10.         "2200.0",2,  
  11.         "3300.0",2,  
  12.         "1200.0",1,  
  13.         "2100.0",1,  
  14.         "4400.0",1]},  
  15.     "facet_dates":{},  
  16.     "facet_ranges":{}}}  
"facet_counts":{
    "facet_queries":{},
    "facet_fields":{
      "brand":[
        "蘋果",4,
        "聯想",3,
        "惠普",2],
      "price":[
        "1100.0",2,
        "2200.0",2,
        "3300.0",2,
        "1200.0",1,
        "2100.0",1,
        "4400.0",1]},
    "facet_dates":{},
    "facet_ranges":{}}}

 從返回結果可以看出各個field欄位互不影響;而且可以針對,下面例項會體現

每個Facet欄位設定查詢引數.以下介紹的引數既可以應用於所有的Facet欄位,也可以應用於每個單獨的Facet欄位.應用於單獨的欄位時通過下面語法實現

[java] view plain copy print?
  1. f.欄位名.引數名=引數值  
f.欄位名.引數名=引數值

 例如:將facet.prefix引數應用於brand欄位,可以採用如下形式

[java] view plain copy print?
  1. &facet.field=brand  
  2. &facet.field=price  
  3. &f.brand.facet.prefix=聯  
&facet.field=brand
&facet.field=price
&f.brand.facet.prefix=聯

 返回結果如下:

[java] view plain copy print?
  1. "facet_counts":{  
  2.     "facet_queries":{},  
  3.     "facet_fields":{  
  4.       "brand":[  
  5.         "聯想",3],  
  6.       "price":[  
  7.         "1100.0",2,  
  8.         "2200.0",2,  
  9.         "3300.0",2,  
  10.         "1200.0",1,  
  11.         "2100.0",1,  
  12.         "4400.0",1]},  
  13.     "facet_dates":{},  
  14.     "facet_ranges":{}}}  
"facet_counts":{
    "facet_queries":{},
    "facet_fields":{
      "brand":[
        "聯想",3],
      "price":[
        "1100.0",2,
        "2200.0",2,
        "3300.0",2,
        "1200.0",1,
        "2100.0",1,
        "4400.0",1]},
    "facet_dates":{},
    "facet_ranges":{}}}

溫馨提示:上面的facet.prefix就是一個引數名,這個很容易誤解為兩個,因為他中間有個點

上面介紹了facet.field引數,下面介紹field fact的其他引數

[java] view plain copy print?
  1. 1).facet.prefix  
  2.     表示Facet欄位值的字首.比如facet.field=cpu&facet.prefix=Intel,那麼對cpu欄位進行Facet查詢,返回的cpu都是以“Intel”開頭的。  
  3. 2).facet.sort  
  4.     表示Facet欄位值以哪種順序返回.可接受的值為true(count)|false(index,lex). true(count)表示按照count降序; false(index,lex)表示按照欄位值升序(字母,數字的順序)排列.預設情況下為true(count).當facet.limit值為負數時,預設facet.sort= false(index,lex).  
  5. 3).facet.limit  
  6.     限制Facet欄位返回的結果條數.預設值為100.如果此值為負數,表示不限制.  
  7. 4).facet.offset  
  8.     返回結果集的偏移量,預設為0.它與facet.limit配合使用可以達到分頁的效果.  
  9. 5).facet.mincount  
  10.     限制了Facet欄位值的最小count,預設為0.合理設定該引數可以將使用者的關注點集中在少數比較熱門的領域.相當於group by having  
  11. 6).facet.missing  
  12.     預設為””,如果設定為true或者on,那麼將統計那些該Facet欄位值為null的記錄.  
  13. 7).facet.method  
  14.     取值為enum或fc,預設為fc.該欄位表示了兩種Facet的演算法,與執行效率相關.  
  15.     enum適用於欄位值比較少的情況,比如欄位型別為布林型,或者欄位表示中國的所有省份.Solr會遍歷該欄位的所有取值,並從filterCache裡為每個值分配一個filter(這裡要求solrconfig.xml裡對filterCache的設定足夠大).然後計算每個filter與主查詢的交集.  
  16.     fc(表示Field Cache)適用於欄位取值比較多,但在每個文件裡出現次數比較少的情況.Solr會遍歷所有的文件,在每個文件內搜尋Cache內的值,如果找到就將Cache內該值的count加1.  
  17. 8).facet.enum.cache.minDf  
  18.     當facet.method=enum時,此引數其作用,minDf表示minimum document frequency.也就是文件內出現某個關鍵字的最少次數.該引數預設值為0.設定該引數可以減少filterCache的記憶體消耗,但會增加總的查詢時間(計算交集的時間增加了).如果設定該值的話,官方文件建議優先嚐試25-50內的值.  
1).facet.prefix
	表示Facet欄位值的字首.比如facet.field=cpu&facet.prefix=Intel,那麼對cpu欄位進行Facet查詢,返回的cpu都是以“Intel”開頭的。
2).facet.sort
	表示Facet欄位值以哪種順序返回.可接受的值為true(count)|false(index,lex). true(count)表示按照count降序; false(index,lex)表示按照欄位值升序(字母,數字的順序)排列.預設情況下為true(count).當facet.limit值為負數時,預設facet.sort= false(index,lex).
3).facet.limit
	限制Facet欄位返回的結果條數.預設值為100.如果此值為負數,表示不限制.
4).facet.offset
	返回結果集的偏移量,預設為0.它與facet.limit配合使用可以達到分頁的效果.
5).facet.mincount
	限制了Facet欄位值的最小count,預設為0.合理設定該引數可以將使用者的關注點集中在少數比較熱門的領域.相當於group by having
6).facet.missing
	預設為””,如果設定為true或者on,那麼將統計那些該Facet欄位值為null的記錄.
7).facet.method
	取值為enum或fc,預設為fc.該欄位表示了兩種Facet的演算法,與執行效率相關.
	enum適用於欄位值比較少的情況,比如欄位型別為布林型,或者欄位表示中國的所有省份.Solr會遍歷該欄位的所有取值,並從filterCache裡為每個值分配一個filter(這裡要求solrconfig.xml裡對filterCache的設定足夠大).然後計算每個filter與主查詢的交集.
	fc(表示Field Cache)適用於欄位取值比較多,但在每個文件裡出現次數比較少的情況.Solr會遍歷所有的文件,在每個文件內搜尋Cache內的值,如果找到就將Cache內該值的count加1.
8).facet.enum.cache.minDf
	當facet.method=enum時,此引數其作用,minDf表示minimum document frequency.也就是文件內出現某個關鍵字的最少次數.該引數預設值為0.設定該引數可以減少filterCache的記憶體消耗,但會增加總的查詢時間(計算交集的時間增加了).如果設定該值的話,官方文件建議優先嚐試25-50內的值.
 

六) Date Facet

       日期型別的欄位在文件中很常見,如商品上市時間,貨物出倉時間,書籍上架時間等等.某些情況下需要針對這些欄位進行Facet.不過時間欄位的取值有無限性,使用者往往關心的不是某個時間點而是某個時間段內的查詢統計結果. Solr為日期欄位提供了更為方便的查詢統計方式.當然,欄位的型別必須是DateField(或其子型別)。

        需要注意的是,使用Date Facet時,欄位名,起始時間,結束時間,時間間隔這4個引數都必須提供.與Field Facet類似,Date Facet也可以對多個欄位進行Facet.並且針對每個欄位都可以單獨設定引數。

簡單例項參考

[java] view plain copy print?
  1. &facet.date=birthday  
  2. &facet.date.start=2014-01-00T09:15:00Z  
  3. &facet.date.end=2014-12-00T09:15:00Z  
  4. &facet.date.gap=%2B1MONTH  
&facet.date=birthday
&facet.date.start=2014-01-00T09:15:00Z
&facet.date.end=2014-12-00T09:15:00Z
&facet.date.gap=%2B1MONTH

 返回結果如下所示

[java] view plain copy print?
  1. "facet_counts":{  
  2.     "facet_queries":{},  
  3.     "facet_fields":{},  
  4.     "facet_dates":{  
  5.       "birthday":{  
  6.         "2013-12-31T09:15:00Z":0,  
  7.         "2014-01-31T09:15:00Z":0,  
  8.         "2014-02-28T09:15:00Z":0,  
  9.         "2014-03-28T09:15:00Z":0,  
  10.         "2014-04-28T09:15:00Z":0,  
  11.         "2014-05-28T09:15:00Z":0,  
  12.         "2014-06-28T09:15:00Z":0,  
  13.         "2014-07-28T09:15:00Z":0,  
  14.         "2014-08-28T09:15:00Z":0,  
  15.         "2014-09-28T09:15:00Z":1,  
  16.         "2014-10-28T09:15:00Z":5,  
  17.         "2014-11-28T09:15:00Z":3,  
  18.         "gap":"+1MONTH",  
  19.         "start":"2013-12-31T09:15:00Z",  
  20.         "end":"2014-12-28T09:15:00Z"}},  
  21.     "facet_ranges":{}}}  
"facet_counts":{
    "facet_queries":{},
    "facet_fields":{},
    "facet_dates":{
      "birthday":{
        "2013-12-31T09:15:00Z":0,
        "2014-01-31T09:15:00Z":0,
        "2014-02-28T09:15:00Z":0,
        "2014-03-28T09:15:00Z":0,
        "2014-04-28T09:15:00Z":0,
        "2014-05-28T09:15:00Z":0,
        "2014-06-28T09:15:00Z":0,
        "2014-07-28T09:15:00Z":0,
        "2014-08-28T09:15:00Z":0,
        "2014-09-28T09:15:00Z":1,
        "2014-10-28T09:15:00Z":5,
        "2014-11-28T09:15:00Z":3,
        "gap":"+1MONTH",
        "start":"2013-12-31T09:15:00Z",
        "end":"2014-12-28T09:15:00Z"}},
    "facet_ranges":{}}}

  Date Facet引數說明

[java] view plain copy print?
  1. 1).facet.date  
  2.     該引數表示需要進行Date Facet的欄位名,與facet.field一樣,該引數可以被設定多次,表示對多個欄位進行Date Facet.  
  3. 2).facet.date.start  
  4.     起始時間,時間格式為1995-12-31T23:59:59Z  
  5. 3).facet.date.end  
  6.     結束時間.  
  7. 4).facet.date.gap  
  8.     時間間隔.如果start為2009-1-1,end為2010-1-1.gap設定為+1MONTH表示間隔1個月,那麼將會把這段時間劃分為12個間隔段.  
  9.         注意+因為是特殊字元所以應該用%2B代替.  
  10. 5).facet.date.hardend  
  11.     取值可以為true|false,預設為false.它表示gap迭代到end處採用何種處理.舉例說明start為2009-1-1,end為2009-12-25,gap為+1MONTH,  
  12.     hardend為false的話最後一個時間段為2009-12-12010-1-1;  
  13.     hardend為true的話最後一個時間段為2009-12-12009-12-25.  
  14. 6).facet.date.other  
  15.     取值範圍為before|after|between|none|all,預設為none,before會對start之前的值做統計,after會對end之後的值做統計,between會對start至end之間所有值做統計.如果hardend為true的話,那麼該值就是各個時間段統計值的和.none表示該項禁用.all表示before,after,all都會統計.  
1).facet.date
	該引數表示需要進行Date Facet的欄位名,與facet.field一樣,該引數可以被設定多次,表示對多個欄位進行Date Facet.
2).facet.date.start
	起始時間,時間格式為1995-12-31T23:59:59Z
3).facet.date.end
	結束時間.
4).facet.date.gap
	時間間隔.如果start為2009-1-1,end為2010-1-1.gap設定為+1MONTH表示間隔1個月,那麼將會把這段時間劃分為12個間隔段.
        注意+因為是特殊字元所以應該用%2B代替.
5).facet.date.hardend
	取值可以為true|false,預設為false.它表示gap迭代到end處採用何種處理.舉例說明start為2009-1-1,end為2009-12-25,gap為+1MONTH,
	hardend為false的話最後一個時間段為2009-12-1至2010-1-1;
	hardend為true的話最後一個時間段為2009-12-1至2009-12-25.
6).facet.date.other
	取值範圍為before|after|between|none|all,預設為none,before會對start之前的值做統計,after會對end之後的值做統計,between會對start至end之間所有值做統計.如果hardend為true的話,那麼該值就是各個時間段統計值的和.none表示該項禁用.all表示before,after,all都會統計.
 

 例項參考,演示fact.date.other、跟單獨對某個欄位起作用

[java] view plain copy print?
  1. &facet.date=birthday  
  2. &facet.date.start=2014-01-00T09:15:00Z  
  3. &facet.date.end=2014-12-00T09:15:00Z  
  4. &facet.date.gap=%2B1MONTH  
  5. &facet.date.other=all  
  6. &f.birthday.facet.mincount=3 --單獨對某個欄位起作用,把統計值小於3的過濾掉  
&facet.date=birthday
&facet.date.start=2014-01-00T09:15:00Z
&facet.date.end=2014-12-00T09:15:00Z
&facet.date.gap=%2B1MONTH
&facet.date.other=all
&f.birthday.facet.mincount=3 --單獨對某個欄位起作用,把統計值小於3的過濾掉

 返回結果如下:

[java] view plain copy print?
  1. "facet_counts":{  
  2.     "facet_queries":{},  
  3.     "facet_fields":{},  
  4.     "facet_dates":{  
  5.       "birthday":{  
  6.         "2014-10-28T09:15:00Z":5,  
  7.         "2014-11-28T09:15:00Z":3,  
  8.         "gap":"+1MONTH",  
  9.         "start":"2013-12-31T09:15:00Z",  
  10.         "end":"2014-12-28T09:15:00Z",  
  11.         "before":0,  
  12.         "after":0,  
  13.         "between":9}},  
  14.     "facet_ranges":{}}}  
"facet_counts":{
    "facet_queries":{},
    "facet_fields":{},
    "facet_dates":{
      "birthday":{
        "2014-10-28T09:15:00Z":5,
        "2014-11-28T09:15:00Z":3,
        "gap":"+1MONTH",
        "start":"2013-12-31T09:15:00Z",
        "end":"2014-12-28T09:15:00Z",
        "before":0,
        "after":0,
        "between":9}},
    "facet_ranges":{}}}

七)Facet Range

      範圍統計分組統計,跟Date Facet一樣,只是他們定位的欄位的型別不同,Data Fact是做日期的分組統計的,而Fact Range是做數字分組統計的,在次強調,是做數字分組統計的,對於字串,日期是不可以的。

引數跟上面的Date Facet基本一致,如下,就不做解釋了,參考Date Facet的各個引數

[java] view plain copy print?
  1. 1.  facet.range  
  2. 2.  facet.range.start  
  3. 3.  facet.range.end  
  4. 4.  facet.range.gap  
  5. 5.  facet.range.hardend  
  6. 6.  facet.range.other  
  7. 7.  facet.range.include  
1.	facet.range
2.	facet.range.start
3.	facet.range.end
4.	facet.range.gap
5.	facet.range.hardend
6.	facet.range.other
7.	facet.range.include

 參考例項

[java] view plain copy print?
  1. &facet.range=price  
  2. &facet.range.start=1000
  3. &facet.range.end=5000
  4. &facet.range.gap=1000
  5. &f.price.facet.mincount=2--單獨對某個欄位起作用,把統計值小於2的過濾掉  
&facet.range=price
&facet.range.start=1000
&facet.range.end=5000
&facet.range.gap=1000
&f.price.facet.mincount=2--單獨對某個欄位起作用,把統計值小於2的過濾掉

 返回結果如下:

 "facet_counts":{
    "facet_queries":{},
    "facet_fields":{},
    "facet_dates":{},
    "facet_ranges":{
      "price":{
        "counts":[
          "1000.0",3,
          "2000.0",3,
          "3000.0",2],
        "gap":1000.0,
        "start":1000.0,
        "end":5000.0}}}}

八)key 操作符

上面已經介紹了facet的四類統計,下面介紹一下key,什麼是key?

答:key操作符可以為Facet欄位取一個別名。哦原來如此簡單!

參考例項:

[java] view plain copy print?
  1. 引數  
  2. &facet=true
  3. &facet.query=brand:聯想 AND price:1100
  4. 返回結果  
  5. "facet_counts":{  
  6.     "facet_queries":{  
  7.       "brand:聯想 AND price:1100":1},  
  8.     "facet_fields":{},  
  9.     "facet_dates":{},  
  10.     "facet_ranges":{}}}  
  11. --------------------------------  
  12. 引數  
  13. &facet=true
  14. &facet.query={!key=聯想}brand:聯想 AND price:1100
  15. 返回結果  
  16. "facet_counts":{  
  17.     "facet_queries":{  
  18.       "聯想":1},  
  19.     "facet_fields":{},  
  20.     "facet_dates":{},  
  21.     "facet_ranges":{}}}  
引數
&facet=true
&facet.query=brand:聯想 AND price:1100 
返回結果
"facet_counts":{
    "facet_queries":{
      "brand:聯想 AND price:1100":1},
    "facet_fields":{},
    "facet_dates":{},
    "facet_ranges":{}}}
--------------------------------
引數
&facet=true
&facet.query={!key=聯想}brand:聯想 AND price:1100 
返回結果
"facet_counts":{
    "facet_queries":{
      "聯想":1},
    "facet_fields":{},
    "facet_dates":{},
    "facet_ranges":{}}}

 從上面可以看出來,這樣可以讓欄位名統一起來,方便我們拿到請求資料後,封裝成自己的物件

九)tag操作符和ex操作符

這個也非常的重要,看下應用場景,當查詢使用filter query 或者q的時候,如果filter query的欄位正好是Facet欄位,那麼查詢結果往往被限制在某一個值內.

參考例項

[java] view plain copy print?
  1. &fq=price:[1000 TO 2000]  
  2. &facet.field=price  
&fq=price:[1000 TO 2000]
&facet.field=price

 返回結果

[java] view plain copy print?
  1. "facet_counts":{  
  2.     "facet_queries":{},  
  3.     "facet_fields":{  
  4.       "price":[  
  5.         "1100.0",2,  
  6.         "1200.0",1,  
  7.         "2100.0",0,  
  8.         "2200.0",0,  
  9.         "3300.0",0,  
  10.         "4400.0",0]},  
  11.     "facet_dates":{},  
  12.     "facet_ranges":{}}}  
"facet_counts":{
    "facet_queries":{},
    "facet_fields":{
      "price":[
        "1100.0",2,
        "1200.0",1,
        "2100.0",0,
        "2200.0",0,
        "3300.0",0,
        "4400.0",0]},
    "facet_dates":{},
    "facet_ranges":{}}}

       從返回的結果可以看到fq將查詢的結果集限制在了price 在1000 至 2000之間,其他範圍的統計沒有實際意義。

    有些時候,使用者希望把結果限制在某一個範圍以內,又希望檢視該範圍外的概況,像上述情況,使用者想把結果限制在(price)1000~2000之間,但是又想檢視其他價格區間有多少產品。這個時候需要用到tag和ex操作符.tag就是把一個filter標記起來,ex(exclude)是在Facet的時候把標記過的filter排除在外.

參考例項

[java] view plain copy print?
  1. &fq={!tag=aa}price:[1000 TO 2000]  
  2. &facet.field={!ex=aa}price  
&fq={!tag=aa}price:[1000 TO 2000]
&facet.field={!ex=aa}price

 返回結果

[java] view plain copy print?
  1. "facet_counts":{  
  2.     "facet_queries":{},  
  3.     "facet_fields":{  
  4.       "price":[  
  5.         "1100.0",2,  
  6.         "2200.0",2,  
  7.         "3300.0",2,  
  8.         "1200.0",1,  
  9.         "2100.0",1,  
  10.         "4400.0",1]},  
  11.     "facet_dates":{},  
  12.     "facet_ranges":{}}}  
"facet_counts":{
    "facet_queries":{},
    "facet_fields":{
      "price":[
        "1100.0",2,
        "2200.0",2,
        "3300.0",2,
        "1200.0",1,
        "2100.0",1,
        "4400.0",1]},
    "facet_dates":{},
    "facet_ranges":{}}}

 這樣其它價格區間的統計資訊就有意義了.

十)Facet 欄位設計

一、Facet欄位的要求

        Facet的欄位必須被索引.一般來說該欄位無需分詞,無需儲存.

        無需分詞是因為該欄位的值代表了一個整體概念,如電腦的品牌”聯想”代表了一個整體概念,如果拆成”聯”,”想”兩個字都不具有實際意義.另外該欄位的值無需進行大小寫轉換等處理,保持其原貌即可.

        無需儲存是因為一般而言使用者所關心的並不是該欄位的具體值,而是作為對查詢結果進行分組的一種手段,使用者一般會沿著這個分組進一步深入搜尋.

二、特殊情況

          對於一般查詢而言,分詞和儲存都是必要的.比如CPU型別“Intel 酷睿2雙核 P7570”,拆分成“Intel”,“酷睿”,“P7570”這樣一些關鍵字並分別索引,可能提供更好的搜尋體驗.但是如果將CPU作為Facet欄位,最好不進行分詞.這樣就造成了矛盾,解決方法為,將CPU欄位設定為不分詞不儲存,然後建立另外一個欄位為它的COPY,對這個COPY的欄位進行分詞和儲存.

[java] view plain copy print?
  1. <types>  
  2.     <fieldType name="string"class="solr.StrField" omitNorms="true"/>  
  3.     <fieldType name="tokened"class="solr.TextField" >  
  4.         <analyzer>  
  5.         ……  
  6.         </analyzer>  
  7.     </fieldType>  
  8. </types>  
  9. <fields>  
  10.     <field name="cpu" type="string" indexed="true" stored="false"/>  
  11.     <field name="cpuCopy” type=" tokened" indexed="true" stored="true"/>  
  12. </fields>  
  13. <copyField source="cpu" dest="cpuCopy"/>  
<types>
	<fieldType name="string" class="solr.StrField" omitNorms="true"/>
	<fieldType name="tokened" class="solr.TextField" >
		<analyzer>
		……
		</analyzer>
	</fieldType>
</types>
<fields>
	<field name="cpu" type="string" indexed="true" stored="false"/>
	<field name="cpuCopy” type=" tokened" indexed="true" stored="true"/>
</fields>
<copyField source="cpu" dest="cpuCopy"/>

官網API:  http://wiki.apache.org/solr/SimpleFacetParameters 

相關推薦

Solr Facet 統計查詢

Solr Facet查詢 一)概述         Facet是solr的高階搜尋功能之一,可以給使用者提供更友好的搜尋體驗.在搜尋關鍵字的同時,能夠按照Facet的欄位進行分組並統計。例如下圖所示,你上淘寶,輸入“電腦”進行搜尋,就會出現品牌分類,價格範圍等分類,這個就叫Facet。   二)Sol

Solr分組聚合查詢Facet

摘要: Solr的分組聚合是一個籠統的概念,目的就是把查詢結果做分類,有多種方式可以做到很類似的結果。也正是由於它們的不同表現,可以適合於多種場景。 何為Facet Facet是一種手段,用來將搜尋結果分類,它並不會修改查詢結果資訊,只是給分類後的結果加上了

Solr---Facet分面查詢中時間區間分面的坑

場景描述:        上一篇分面查詢文章中,我們提到了時間區間分面,但是在使用的過程中,遇到了很坑的事情,那就是時區。        如果忽視時區,直接設定時間,時間分面查詢的結果。很自然的你會設定起始時間都為該月1號00:00:00,但是因為時區的問題,在Solrj處理

solr facet查詢及solrj 讀取facet資料(相當有用)

Facet 是 solr 的高階搜尋功能之一 , 可以給使用者提供更友好的搜尋體驗 . 在搜尋關鍵字的同時 , 能夠按照 Facet 的欄位進行分組並統計 . 一般代表了實體的某種公共屬性 , 如商品的分類 , 商品的製造廠家 , 書籍的出版商等等 . Face

Solr Facet 查詢

Solr Facet查詢 一)概述         Facet是solr的高階搜尋功能之一,可以給使用者提供更友好的搜尋體驗.在搜尋關鍵字的同時,能夠按照Facet的欄位進行分組並統計。例如下圖所示,你上淘寶,輸入“電腦”進行搜尋,就會出現品牌分類,價格範圍等分類,這個就叫Facet。   二)Solr

乘機人統計查詢

message sdn string 使用 時間 json 天數 str inf 詳情鏈接:http://www.haoservice.com/docs/89 查詢乘機人統計的詳細信息 支持格式: JSON/XML 請求方式: GET/POST

sql 統計查詢(按月統計

evel ring level group 轉化 nec 如果 select left join --String 類型 轉化為 年月日 yyyy-mm-dd to_date(substr(t.submit_time,1,10))) 如果統計一年 需要用 l

oracle分組統計查詢

分組統計查詢(本次都是使用scott使用者下的表格)知識點 1. 統計函式的使用; 2. 分組統計的查詢的實現; 3. 對分組的資料過濾; * 統計函式(又稱分組函式) 之前學過的count()函式。這個函式主要的作用是統計一張資料表格的資料量的個數。常用函式分共5個:為connt

mysql :=和=的區別及統計查詢結果行號

變數初始化:@rownum:=0 累加,標記行號:@rownum:[email protected]+1 SELECT rank FROM ( SELECT id, @rownum := CAST(@rownum AS SIGNED) + 1 AS rank

Mysql按年按月按日按周統計查詢

<!-- 按日查詢 --> SELECT DATE_FORMAT(created_date,'%Y-%m-%d') as time,sum(money) money FROM o_finance_detail where org_id = 1000 GROUP BY time

Solr 高亮查詢程式碼記錄

/** * 高亮查詢 */ //建立高亮查詢 SimpleHighlightQuery query = new SimpleHighlightQuery(); //設定查詢選項 Hig

mysql統計查詢

好久沒寫部落格了,不知道寫撒,就寫寫統計吧 很多時候我們都會用到統計查詢,在現在一個後臺沒有點什麼折線圖,什麼圖示展示都會顯得這個後臺一點不高大上, 列舉一下表 drop table if exists oa_users; /*======================

Solr高亮查詢案例

本例程使用Solr高亮查詢商品名稱,使用FreeMarker生成靜態頁面,Solr與FreeMarker都是使用直接呼叫的方式,沒有使用與SpringBoot整合方案。 資料庫SQL create table t_good (id int a

solr實現同義詞查詢及分詞粒度

首先要自己修改IKAnalyzer2012FF_u2.jar包然後重新打包   修改後的jar包下載地址:http://download.csdn.net/detail/u014793522/9594470 同義詞下載地址: http://download.csdn.net

常用工具類--solr索引新增 查詢 刪除

solr常用操作  首先是連線solr伺服器: public class solrServer { private solrServer(){}; final static String SOLR_URL = "http://localhost:8080/solr

Mysql 列轉行統計查詢 、行轉列統計查詢

- ---------------------------- -- Table structure for `TabName` -- ---------------------------- DROP TABLE IF EXISTS `TabN

(一)solr 7.31版本window系統全程安裝搭建,涵蓋專案用到的大部分配置,常用查詢solr多條件查詢、排序,配置資料庫,定時同步,全量與增量更新,使用solrJ在java程式進行增刪改查

前言:由於專案最近在做淘寶客商品資訊查詢這一塊,做搜尋引擎,離不開全文搜尋伺服器,我這裡選擇了solr。solr的好處可以自行百科,這裡主要是講解技術。這篇文章主要講解window的安裝和使用。若大家感興趣或者專案用到,希望你能跟著我的步驟進行下去,如果遇到問題,可以後續看下我在最底下的問題

Solr搜尋統計 JSON Faceting API

一、背景 我是您不知道的統計和聚合,我很漂亮、也很簡潔,我是結構化,有些迷人的新查詢語法。您可以不知道stats和facet,但您不應該不知道我,我是Solr JSON Facet API,出身於Solr5。 solr 5.3的時候完全重寫了Solr查詢語法,其中最

MySQL巧用sum,case...when...優化統計查詢

最近在做專案,涉及到開發統計報表相關的任務,由於資料量相對較多,之前寫的查詢語句查詢五十萬條資料大概需要十秒左右的樣子,後來經過老大的指點利用sum,case...when...重寫SQL效能一下子提高到一秒鐘就解決了。這裡為了簡潔明瞭的闡述問題和解決的方法,我簡化一下需求模型。 現在資料庫有一

solr分頁查詢和高亮

二、Solr理論 1、 solr基礎 因為 Solr 包裝並擴充套件了 Lucene,所以它們使用很多相同的術語。更重要的是,Solr 建立的索引與 Lucene 搜尋引擎庫完全相容。通過對 Solr 進行適當的配置,某些情況下可能需要進行編碼,Solr 可以閱讀和使