日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Solr Facet 查询

發(fā)布時(shí)間:2023/12/31 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Solr Facet 查询 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??

Solr Facet查詢(xún)

轉(zhuǎn)載請(qǐng)出自出處:http://eksliang.iteye.com/blog/2165882

一)概述

? ? ? ? Facet是solr的高級(jí)搜索功能之一,可以給用戶提供更友好的搜索體驗(yàn).在搜索關(guān)鍵字的同時(shí),能夠按照Facet的字段進(jìn)行分組并統(tǒng)計(jì)。例如下圖所示,你上淘寶,輸入“電腦”進(jìn)行搜索,就會(huì)出現(xiàn)品牌分類(lèi),價(jià)格范圍等分類(lèi),這個(gè)就叫Facet。



?

二)Solr Facet類(lèi)型?

Solr提供了4種類(lèi)型的Fact

?

<lst name="facet_counts"><lst name="facet_queries"/><lst name="facet_fields"/><lst name="facet_dates"/><lst name="facet_ranges"/> </lst>

?

  • facet_queries:代表自定義條件查詢(xún)facet,類(lèi)似數(shù)據(jù)庫(kù)的count函數(shù)
  • facet_fields ? ?:代表根據(jù)字段分組查詢(xún),類(lèi)似數(shù)據(jù)庫(kù)的group by count的組合
  • facet_dates :根據(jù)日期區(qū)間分組查詢(xún)
  • facet_ranges:當(dāng)然了,日期有區(qū)間,數(shù)字也有,這個(gè)就是根據(jù)數(shù)字分組查詢(xún)
  • 三)Solr Facet組件?

    ? ? ? ? ?Solr的默認(rèn)requestHandler已經(jīng)包含了Facet組件(solr.FacetComponent).如果自定義requestHandler或者對(duì)默認(rèn)的requestHandler自定義組件列表,那么需要將Facet加入到組件列表中去.

    ?

    四)facet query

    ? ? ? ?Facet Query 用戶自定義條件查詢(xún)facet,他提供了非常靈活的Facet.通過(guò)facet.query參數(shù),可以對(duì)任意字段進(jìn)行篩選.下面通過(guò)實(shí)例來(lái)闡述。基本上他的用法,都會(huì)在我實(shí)例中體現(xiàn)出來(lái)

    例一:日期區(qū)間查詢(xún)

    ?

    &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]

    ? ? 返回結(jié)果如下:

    ?

    ?

    ?

    <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:數(shù)字區(qū)間統(tǒng)計(jì)

    ?

    &facet=on &facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z] &facet.query=price:[* TO 5000]

    ?返回結(jié)果

    ?

    ?

    <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:自定義條件

    ?

    ?

    &facet=true &facet.query=brand:聯(lián)想 AND price:1100

    ?返回結(jié)果

    ?

    ?

    "facet_counts":{"facet_queries":{"brand:聯(lián)想 AND price:1100":1},"facet_fields":{},"facet_dates":{},"facet_ranges":{}}}

    ?

    ?

    五)Field Facet

    ? ? ? ?Facet字段通過(guò)在請(qǐng)求中加入facet.field參數(shù)加以聲明,如果需要對(duì)多個(gè)字段進(jìn)行Facet查詢(xún),那么將該參數(shù)聲明多次.這就是類(lèi)似于數(shù)據(jù)庫(kù)的group by 加上count的功能,非常的靈活。

    實(shí)例一:最簡(jiǎn)單的field facet

    ?

    &facet=true &facet.field=brand &facet.field=price

    ?返回結(jié)果如下

    ?

    ?

    "facet_counts":{"facet_queries":{},"facet_fields":{"brand":["蘋(píng)果",4,"聯(lián)想",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":{}}}

    ?從返回結(jié)果可以看出各個(gè)field字段互不影響;而且可以針對(duì),下面實(shí)例會(huì)體現(xiàn)

    ?

    ?

    每個(gè)Facet字段設(shè)置查詢(xún)參數(shù).以下介紹的參數(shù)既可以應(yīng)用于所有的Facet字段,也可以應(yīng)用于每個(gè)單獨(dú)的Facet字段.應(yīng)用于單獨(dú)的字段時(shí)通過(guò)下面語(yǔ)法實(shí)現(xiàn)

    ?

    f.字段名.參數(shù)名=參數(shù)值

    ?例如:將facet.prefix參數(shù)應(yīng)用于brand字段,可以采用如下形式

    ?

    ?

    &facet.field=brand &facet.field=price &f.brand.facet.prefix=聯(lián)

    ?返回結(jié)果如下:

    ?

    "facet_counts":{"facet_queries":{},"facet_fields":{"brand":["聯(lián)想",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就是一個(gè)參數(shù)名,這個(gè)很容易誤解為兩個(gè),因?yàn)樗虚g有個(gè)點(diǎn)

    上面介紹了facet.field參數(shù),下面介紹field fact的其他參數(shù)

    ?

    1).facet.prefix表示Facet字段值的前綴.比如facet.field=cpu&facet.prefix=Intel,那么對(duì)cpu字段進(jìn)行Facet查詢(xún),返回的cpu都是以“Intel”開(kāi)頭的。 2).facet.sort表示Facet字段值以哪種順序返回.可接受的值為true(count)|false(index,lex). true(count)表示按照count降序; false(index,lex)表示按照字段值升序(字母,數(shù)字的順序)排列.默認(rèn)情況下為true(count).當(dāng)facet.limit值為負(fù)數(shù)時(shí),默認(rèn)facet.sort= false(index,lex). 3).facet.limit限制Facet字段返回的結(jié)果條數(shù).默認(rèn)值為100.如果此值為負(fù)數(shù),表示不限制. 4).facet.offset返回結(jié)果集的偏移量,默認(rèn)為0.它與facet.limit配合使用可以達(dá)到分頁(yè)的效果. 5).facet.mincount限制了Facet字段值的最小count,默認(rèn)為0.合理設(shè)置該參數(shù)可以將用戶的關(guān)注點(diǎn)集中在少數(shù)比較熱門(mén)的領(lǐng)域.相當(dāng)于group by having 6).facet.missing默認(rèn)為””,如果設(shè)置為true或者on,那么將統(tǒng)計(jì)那些該Facet字段值為null的記錄. 7).facet.method取值為enum或fc,默認(rèn)為fc.該字段表示了兩種Facet的算法,與執(zhí)行效率相關(guān).enum適用于字段值比較少的情況,比如字段類(lèi)型為布爾型,或者字段表示中國(guó)的所有省份.Solr會(huì)遍歷該字段的所有取值,并從filterCache里為每個(gè)值分配一個(gè)filter(這里要求solrconfig.xml里對(duì)filterCache的設(shè)置足夠大).然后計(jì)算每個(gè)filter與主查詢(xún)的交集.fc(表示Field Cache)適用于字段取值比較多,但在每個(gè)文檔里出現(xiàn)次數(shù)比較少的情況.Solr會(huì)遍歷所有的文檔,在每個(gè)文檔內(nèi)搜索Cache內(nèi)的值,如果找到就將Cache內(nèi)該值的count加1. 8).facet.enum.cache.minDf當(dāng)facet.method=enum時(shí),此參數(shù)其作用,minDf表示minimum document frequency.也就是文檔內(nèi)出現(xiàn)某個(gè)關(guān)鍵字的最少次數(shù).該參數(shù)默認(rèn)值為0.設(shè)置該參數(shù)可以減少filterCache的內(nèi)存消耗,但會(huì)增加總的查詢(xún)時(shí)間(計(jì)算交集的時(shí)間增加了).如果設(shè)置該值的話,官方文檔建議優(yōu)先嘗試25-50內(nèi)的值. ?

    ?

    ?

    六) Date Facet

    ? ? ? ?日期類(lèi)型的字段在文檔中很常見(jiàn),如商品上市時(shí)間,貨物出倉(cāng)時(shí)間,書(shū)籍上架時(shí)間等等.某些情況下需要針對(duì)這些字段進(jìn)行Facet.不過(guò)時(shí)間字段的取值有無(wú)限性,用戶往往關(guān)心的不是某個(gè)時(shí)間點(diǎn)而是某個(gè)時(shí)間段內(nèi)的查詢(xún)統(tǒng)計(jì)結(jié)果. Solr為日期字段提供了更為方便的查詢(xún)統(tǒng)計(jì)方式.當(dāng)然,字段的類(lèi)型必須是DateField(或其子類(lèi)型)。

    ? ? ? ? 需要注意的是,使用Date Facet時(shí),字段名,起始時(shí)間,結(jié)束時(shí)間,時(shí)間間隔這4個(gè)參數(shù)都必須提供.與Field Facet類(lèi)似,Date Facet也可以對(duì)多個(gè)字段進(jìn)行Facet.并且針對(duì)每個(gè)字段都可以單獨(dú)設(shè)置參數(shù)。

    簡(jiǎn)單實(shí)例參考

    &facet.date=birthday &facet.date.start=2014-01-00T09:15:00Z &facet.date.end=2014-12-00T09:15:00Z &facet.date.gap=%2B1MONTH

    ?返回結(jié)果如下所示

    "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參數(shù)說(shuō)明

    ?

    1).facet.date該參數(shù)表示需要進(jìn)行Date Facet的字段名,與facet.field一樣,該參數(shù)可以被設(shè)置多次,表示對(duì)多個(gè)字段進(jìn)行Date Facet. 2).facet.date.start起始時(shí)間,時(shí)間格式為1995-12-31T23:59:59Z 3).facet.date.end結(jié)束時(shí)間. 4).facet.date.gap時(shí)間間隔.如果start為2009-1-1,end為2010-1-1.gap設(shè)置為+1MONTH表示間隔1個(gè)月,那么將會(huì)把這段時(shí)間劃分為12個(gè)間隔段.注意+因?yàn)槭翘厥庾址詰?yīng)該用%2B代替. 5).facet.date.hardend取值可以為true|false,默認(rèn)為false.它表示gap迭代到end處采用何種處理.舉例說(shuō)明start為2009-1-1,end為2009-12-25,gap為+1MONTH,hardend為false的話最后一個(gè)時(shí)間段為2009-12-1至2010-1-1;hardend為true的話最后一個(gè)時(shí)間段為2009-12-1至2009-12-25. 6).facet.date.other取值范圍為before|after|between|none|all,默認(rèn)為none,before會(huì)對(duì)start之前的值做統(tǒng)計(jì),after會(huì)對(duì)end之后的值做統(tǒng)計(jì),between會(huì)對(duì)start至end之間所有值做統(tǒng)計(jì).如果hardend為true的話,那么該值就是各個(gè)時(shí)間段統(tǒng)計(jì)值的和.none表示該項(xiàng)禁用.all表示before,after,all都會(huì)統(tǒng)計(jì). ?

    ?

    ?實(shí)例參考,演示fact.date.other、跟單獨(dú)對(duì)某個(gè)字段起作用

    &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 --單獨(dú)對(duì)某個(gè)字段起作用,把統(tǒng)計(jì)值小于3的過(guò)濾掉

    ?返回結(jié)果如下:

    "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

    ? ? ? 范圍統(tǒng)計(jì)分組統(tǒng)計(jì),跟Date Facet一樣,只是他們定位的字段的類(lèi)型不同,Data Fact是做日期的分組統(tǒng)計(jì)的,而Fact Range是做數(shù)字分組統(tǒng)計(jì)的,在次強(qiáng)調(diào),是做數(shù)字分組統(tǒng)計(jì)的,對(duì)于字符串,日期是不可以的。

    參數(shù)跟上面的Date Facet基本一致,如下,就不做解釋了,參考Date Facet的各個(gè)參數(shù)

    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

    ?參考實(shí)例

    &facet.range=price &facet.range.start=1000 &facet.range.end=5000 &facet.range.gap=1000 &f.price.facet.mincount=2--單獨(dú)對(duì)某個(gè)字段起作用,把統(tǒng)計(jì)值小于2的過(guò)濾掉

    ?返回結(jié)果如下:

    "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 操作符

    上面已經(jīng)介紹了facet的四類(lèi)統(tǒng)計(jì),下面介紹一下key,什么是key?

    答:key操作符可以為Facet字段取一個(gè)別名。哦原來(lái)如此簡(jiǎn)單!

    參考實(shí)例:

    參數(shù) &facet=true &facet.query=brand:聯(lián)想 AND price:1100 返回結(jié)果 "facet_counts":{"facet_queries":{"brand:聯(lián)想 AND price:1100":1},"facet_fields":{},"facet_dates":{},"facet_ranges":{}}} -------------------------------- 參數(shù) &facet=true &facet.query={!key=聯(lián)想}brand:聯(lián)想 AND price:1100 返回結(jié)果 "facet_counts":{"facet_queries":{"聯(lián)想":1},"facet_fields":{},"facet_dates":{},"facet_ranges":{}}}

    ?從上面可以看出來(lái),這樣可以讓字段名統(tǒng)一起來(lái),方便我們拿到請(qǐng)求數(shù)據(jù)后,封裝成自己的對(duì)象

    ?

    九)tag操作符和ex操作符

    這個(gè)也非常的重要,看下應(yīng)用場(chǎng)景,當(dāng)查詢(xún)使用filter query 或者q的時(shí)候,如果filter query的字段正好是Facet字段,那么查詢(xún)結(jié)果往往被限制在某一個(gè)值內(nèi).

    參考實(shí)例

    &fq=price:[1000 TO 2000] &facet.field=price

    ?返回結(jié)果

    "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":{}}}

    ? ? ? ?從返回的結(jié)果可以看到fq將查詢(xún)的結(jié)果集限制在了price 在1000 至 2000之間,其他范圍的統(tǒng)計(jì)沒(méi)有實(shí)際意義。

    ? ? 有些時(shí)候,用戶希望把結(jié)果限制在某一個(gè)范圍以?xún)?nèi),又希望查看該范圍外的概況,像上述情況,用戶想把結(jié)果限制在(price)1000~2000之間,但是又想查看其他價(jià)格區(qū)間有多少產(chǎn)品。這個(gè)時(shí)候需要用到tag和ex操作符.tag就是把一個(gè)filter標(biāo)記起來(lái),ex(exclude)是在Facet的時(shí)候把標(biāo)記過(guò)的filter排除在外.

    參考實(shí)例

    ?

    &fq={!tag=aa}price:[1000 TO 2000] &facet.field={!ex=aa}price

    ?返回結(jié)果

    ?

    "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":{}}}

    ?這樣其它價(jià)格區(qū)間的統(tǒng)計(jì)信息就有意義了.

    ?

    ?

    十)Facet 字段設(shè)計(jì)

    一、Facet字段的要求

    ? ? ? ? Facet的字段必須被索引.一般來(lái)說(shuō)該字段無(wú)需分詞,無(wú)需存儲(chǔ).

    ? ? ? ? 無(wú)需分詞是因?yàn)樵撟侄蔚闹荡砹艘粋€(gè)整體概念,如電腦的品牌”聯(lián)想”代表了一個(gè)整體概念,如果拆成”聯(lián)”,”想”兩個(gè)字都不具有實(shí)際意義.另外該字段的值無(wú)需進(jìn)行大小寫(xiě)轉(zhuǎn)換等處理,保持其原貌即可.

    ? ? ? ? 無(wú)需存儲(chǔ)是因?yàn)橐话愣杂脩羲P(guān)心的并不是該字段的具體值,而是作為對(duì)查詢(xún)結(jié)果進(jìn)行分組的一種手段,用戶一般會(huì)沿著這個(gè)分組進(jìn)一步深入搜索.

    ?

    二、特殊情況

    ? ? ? ? ? 對(duì)于一般查詢(xún)而言,分詞和存儲(chǔ)都是必要的.比如CPU類(lèi)型“Intel 酷睿2雙核 P7570”,拆分成“Intel”,“酷睿”,“P7570”這樣一些關(guān)鍵字并分別索引,可能提供更好的搜索體驗(yàn).但是如果將CPU作為Facet字段,最好不進(jìn)行分詞.這樣就造成了矛盾,解決方法為,將CPU字段設(shè)置為不分詞不存儲(chǔ),然后建立另外一個(gè)字段為它的COPY,對(duì)這個(gè)COPY的字段進(jìn)行分詞和存儲(chǔ).

    <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"/>

    ?

    ?

    ?官網(wǎng)API: ?http://wiki.apache.org/solr/SimpleFacetParameters?

    ?

    轉(zhuǎn)載于:https://my.oschina.net/boltwu/blog/412865

    總結(jié)

    以上是生活随笔為你收集整理的Solr Facet 查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。