solr-搜索-層面分析
在部分概述在Solr搜索描述,分類是基于索引的搜索結果方面的安排。搜索與索引方面,隨著數值計算有多少匹配的文件被發現是每學期。小面很容易讓用戶探索的搜索結果,縮小正是他們正在尋找的結果。
根據Solr搜索概述中的描述,層面分析是基于搜索結果的排列。所有的Searcher都攜帶有索引term,隨著匹配文檔,term也被發現。層面分析簡化用戶對搜索結果的處理,縮小查找結果范圍。
基本參數
下面的表總結了控制層面分析的一般參數:
facet
設置為true,可以使查詢響應中有層面計數。設置為false或沒有值,不進行層面分析。除非設置為true,否則下面的其他參數將不起作用。默認值是空。
facet.query
這個參數允許你使用Lucene默認語法指定一個隨意的查詢來生成層面計數。默認情況下,Solr的層面分析自動區分相同field的不同term,并返回這些term的數量。使用facet.query,你可以重寫默認行為或精確選擇你希望對哪些term或表達式進行計數。在層面分析的典型實現中,你可以指定facet.query參數的數量。這個參數對以數字范圍為基礎的層面分析或以前綴為基礎的層面分析很有用。
你可以設置對facet.query參數進行多次聲明,來使不同查詢使用隔離的層面約束。
在層面分析中不使用默認語法,用查詢標記的名稱來作為層面分析的前綴。比如,使用假設的MyFunc查詢解析器,你可以設置facet.query參數為:
facet.query={!myfunc}name~fred
1
字面值層面分析參數
在field中基于索引的term,可以使用幾個參數來觸發層面分析。
使用這些參數時,最重要的是”term”在Lucene中是非常特別的概念:它涉及到分析后的索引過程中field/value對的字面值。對于包含stemming(將單詞縮減為詞根形式)、lowercasing(將單詞轉換為小寫字母)或分詞等操作的文本field,可能結果與你期望的不同。如果你希望Solr在完整字符串上進行分析(搜索過程)和層面分析,在schema.xml中使用copyFieldfield,對該field創建兩個版本:一個Text,一個String。兩個都要設置indexed="true"。(獲得更多關于copyField的內容,請參見Documents, Fields, and Schema Design。)
下表中列出Solr中層面分析可以使用的參數。
下面對每個參數進行詳細描述。
facet.field
該參數指定應該進行層面分析的field。遍歷field的所有term,按照約定生成層面計數。在查詢中,這個參數可以指定多次,對多個field進行層面分析。
如果你沒有指定任何一個schema中定義的field,本節中其他參數將不起作用。
facet.prefix
該參數指定需要被進行層面分析的term需要以給定字符串作為前綴。對查詢沒有任何限制,只作用于響應的層面分析查詢。
這個參數可以使用f.
facet.contains
該參數指定需要被進行層面分析的term需要包含給定字符串。對查詢沒有任何限制,只作用于響應的層面分析查詢。
這個參數可以使用f.
facet.contains.ignoreCase
如果使用facet.contains,facet.contains.ignoreCase參數如果設置為true,則忽略大小寫。
這個參數可以使用f.
facet.sort
該參數指定層面結果排序方式。
如果facet.limit大于0,默認使用count,否則,默認使用index。
這個參數可以使用f.
facet.limit
該參數指定最大返回數目(基本上是返回的field的數量)。負值表示對返回數量無限制。
默認值是100。
這個參數可以使用f.
facet.offset
該參數表示返回列表的偏移量,可以用來分頁。
默認值是0。
這個參數可以使用f.
facet.mincount
該參數指定返回結果中進行層面分析的field的最小數量。如果一個field的計數低于指定值,則該field的面將不返回。
默認值是0。
tris parameter can be specified on a per-field basis witr tre syntax of f..facet.mincount.
這個參數可以使用f.
facet.missing
如果設置為true,這個參數表明,除了以term為基礎的層面分析,返回結果中需要計算匹配查詢但是沒有字面值的數據(就是field值為 null 的記錄)。
默認值false。
這個參數可以使用f.
facet.metrod
該參數選擇對某個field進行層面分析時使用的算法或方法。
默認值是fc(除了類型是BoolFiled的field),因為它使用最少的內存,并且在有很多不同term時更快。
這個參數可以使用f.
facet.enum.cache.minDf
該參數指定達到最小的文檔頻率(匹配項的文件數量)時,filtercache應該存儲term。(minDf表示minimum document frequency,也就是文檔內出現某個關鍵字的最少次數。)只有設置facet.metrod=enum時起作用。
設置該參數可以減少filterCache的內存消耗,但會增加總的查詢時間(計算交集的時間增加了)。如果你對某個field存在大量term,又希望減少內存使用,可以設置25-50內的值,然后運行一些測試。然后,優化參數設置。
默認值為0,filterCache可以對所有term使用。
這個參數可以使用f.
Over-Request參數
在某些情況下,在分布式的Solr查詢中為了正確返回”top”約束可以通過使用”Over Requesting”來從每個單獨的分片提高所需數量限制(比如:facet.limit)。在這些情況下,每個分片默認訪問最上面的”10 + (1.5 * facet.limit)”的數據。
在某些情況下,基于你的文檔分布在哪些分片上,你使用的facet.limit值是多少,增加或減少over-requesting的數量是有利的??梢酝ㄟ^設置facet.overrequest.count(默認10)和facet.overrequest.ratio(默認1.5)的值來實現。
facet.trreads
這個參數指定并行加載層面分析的field的線程數量。指定facet.trreads=N,N是使用的最大線程數。不使用該參數或設置為0,將不產生任何額外的線程,只使用主線程來請求。使用負值將創建最多Integer.MAX_VALUE個線程。
范圍分析
可以對datefield或數字field進行范圍分析。這對于分為查詢,比如查詢價格,非常有用。在Solr3.1中,范圍分析由于日期分析(描述如下)。
facet.range
定義Solr進行范圍反洗的字段。比如:
facet.range=price&facet.range=age facet.range=lastModified_dt
1
2
facet.range.start
指定范圍的結束值??梢允褂胒.
f.price.facet.range.start=0.0&f.age.facet.range.start=10 f.lastModified_dt.facet.range.start=NOW/DAY-30DAYS
1
2
facet.range.end
指定范圍的開始值。可以使用f.
f.price.facet.range.end=1000.0&f.age.facet.range.start=99 f.lastModified_dt.facet.range.end=NOW/DAY+30DAYS
1
2
facet.range.gap
指定范圍步進大小。對于date類型的field,需要使用DateMatrParser表達式(比如,facet.range.gap=%2B1DAY ... '+1DAY')??梢允褂胒.
f.price.facet.range.gap=100&f.age.facet.range.gap=10 f.lastModified_dt.facet.range.gap=+1DAY
1
2
facet.range.hardend
布爾參數,指定處理Solr開始和結尾不均勻分布的情況。ture,最后一個范圍只到end值。false,最后一個范圍可能超過end值。
默認值是false。
可以使用f.
facet.range.include
默認情況下,范圍計算過程中,包括facet.range.start定義的結束值,不包括facet.range.end定義的結束值。facet.range.otrer定義的”before”不包含,定義的”after”包含。默認值是”lower”,在邊間不重復計數??梢允褂胒acet.range.include參數修改行為:
可以使用f.
要避免重復計數
facet.range.otrer
計算除了上結束值之間步進統計的數據之外,以其他方式統計數據,可以有一下選項:
可以使用f.
facet.range.metrod
這個參數是用來指定Solr進行范圍分析時使用的算法或方法。不同方法返回結果相同,但是性能可能不同。
默認值是filter。
范圍分析中的facet.mincount
范圍分析中通用可以使用參數facet.mincount。返回結果中不包含小于定義值的數據。
日期分析
日期分析facet.date的參數已經在Solr3.1中標記為過時。鼓勵用戶使用范圍分析,范圍分析可以實現相同功能,并且對于也可以對數字進行范圍分析。返回格式有些許差別,但是參數格式幾乎一樣。
Pivot(決策樹)分析
Pivoting是一個可以進行自動排序、計數、求和、求平均值的統計工具,結果保存在一個表中。結果數據通常在第二個表中展示。Pivot分析可以對多個field進行結果分析,保存在匯總表中。
從另一個方面看,查詢結果生成一個決策樹,比如:“對于A進行層面分析,約束計數是X/N, Y/M, 等。如果你使用X替換A,對于B的約束計數將變成S/P, T/Q,等”。換句話說,它提前告訴你下一個集合是什么。
facet.pivot
該參數指定使用pivot的field。多個facet.pivot將在返回結果中創建多個”facet_pivot”節點。每個field的結果列表通過逗號分隔。
facet.pivot.mincount
該參數指定層面分析結果中包含結果的最小數量。默認1。
以”bin/solr -e techproducts”為例,查詢url如下:
http://localhost:8983/solr/techproducts/select?q=*:*&facet.pivot=cat,popularity,inStock &facet.pivot=popularity,cat&facet=true&facet.field=cat&facet.limit=5 &rows=0&wt=json&indent=true&facet.pivot.mincount=2
1
2
3
結果中的”facet_pivot”是:
"facet_counts":{ "facet_queries":{}, "facet_fields":{ "cat":[ "electronics",14, "currency",4, "memory",3, "connector",2, "graphics card",2]}, "facet_dates":{}, "facet_ranges":{}, "facet_pivot":{ "cat,popularity,inStock":[{ "field":"cat", "value":"electronics", "count":14, "pivot":[{ "field":"popularity", "value":6, "count":5, "pivot":[{ "field":"inStock", "value":true, "count":5}]}, ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
聯合使用pivot與stats
除了一些支持通用局部參數的層面分析,還可以使用統計局部參數來使facet.pivot與stats.field配合使用,達到你想要的統計計算。
在下面的例子中,是對每個facet.pivot結果層次的兩個不同的統計結果集:
stats=true stats.field={!tag=piv1,piv2 min=true max=true}price stats.field={!tag=piv2 mean=true}popularity facet=true facet.pivot={!stats=piv1}cat,inStock facet.pivot={!stats=piv2}manu,inStock
1
2
3
4
5
6
結果是:
"facet_pivot":{ "cat,inStock":[{ "field":"cat", "value":"electronics", "count":12, "pivot":[{ "field":"inStock", "value":true, "count":8, "stats":{ "stats_fields":{ "price":{ "min":74.98999786376953, "max":399.0}}}}, { "field":"inStock", "value":false, "count":4, "stats":{ "stats_fields":{ "price":{ "min":11.5, "max":649.989990234375}}}}], "stats":{ "stats_fields":{ "price":{ "min":11.5, "max":649.989990234375}}}}, { "field":"cat", "value":"currency", "count":4, "pivot":[{ "field":"inStock", "value":true, "count":4, "stats":{ "stats_fields":{ "price":{ ... "manu,inStock":[{ "field":"manu", "value":"inc", "count":8, "pivot":[{ "field":"inStock", "value":true, "count":7, "stats":{ "stats_fields":{ "price":{ "min":74.98999786376953, "max":2199.0}, "popularity":{ "mean":5.857142857142857}}}}, { "field":"inStock", "value":false, "count":1, "stats":{ "stats_fields":{ "price":{ "min":479.95001220703125, "max":479.95001220703125}, "popularity":{ "mean":7.0}}}}], ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
聯合使用層面分析、范圍分析和pivot分析
使用本地查詢參數與facet.pivot結合實現層面分析實例。同樣,使用范圍參數與facet.pivot實現范圍分析。
在下面的例子中,是結合查詢參數與facet.pivot的結果:
facet=true facet.query={!tag=q1}manufacturedate_dt:[2006-01-01T00:00:00Z TO NOW] facet.query={!tag=q1}price:[0 TO 100] facet.pivot={!query=q1}cat,inStock
1
2
3
4
結果:
"facet_counts": { "facet_queries": { "{!tag=q1}manufacturedate_dt:[2006-01-01T00:00:00Z TO NOW]": 9, "{!tag=q1}price:[0 TO 100]": 7 }, "facet_fields": {}, "facet_dates": {}, "facet_ranges": {}, "facet_intervals": {}, "facet_heatmaps": {}, "facet_pivot": { "cat,inStock": [ { "field": "cat", "value": "electronics", "count": 12, "queries": { "{!tag=q1}manufacturedate_dt:[2006-01-01T00:00:00Z TO NOW]": 9, "{!tag=q1}price:[0 TO 100]": 4 }, "pivot": [ { "field": "inStock", "value": true, "count": 8, "queries": { "{!tag=q1}manufacturedate_dt:[2006-01-01T00:00:00Z TO NOW]": 6, "{!tag=q1}price:[0 TO 100]": 2 } }, ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
在下面的例子中,是結合范圍參數與facet.pivot的結果:
facet=true facet.range={!tag=r1}manufacturedate_dt facet.range.start=2006-01-01T00:00:00Z facet.range.end=NOW/YEAR facet.range.gap=+1YEAR facet.pivot={!range=r1}cat,inStock
1
2
3
4
5
6
結果:
"facet_counts":{ "facet_queries":{}, "facet_fields":{}, "facet_dates":{}, "facet_ranges":{ "manufacturedate_dt":{ "counts":[ "2006-01-01T00:00:00Z",9, "2007-01-01T00:00:00Z",0, "2008-01-01T00:00:00Z",0, "2009-01-01T00:00:00Z",0, "2010-01-01T00:00:00Z",0, "2011-01-01T00:00:00Z",0, "2012-01-01T00:00:00Z",0, "2013-01-01T00:00:00Z",0, "2014-01-01T00:00:00Z",0], "gap":"+1YEAR", "start":"2006-01-01T00:00:00Z", "end":"2015-01-01T00:00:00Z"}}, "facet_intervals":{}, "facet_heatmaps":{}, "facet_pivot":{ "cat,inStock":[{ "field":"cat", "value":"electronics", "count":12, "ranges":{ "manufacturedate_dt":{ "counts":[ "2006-01-01T00:00:00Z",9, "2007-01-01T00:00:00Z",0, "2008-01-01T00:00:00Z",0, "2009-01-01T00:00:00Z",0, "2010-01-01T00:00:00Z",0, "2011-01-01T00:00:00Z",0, "2012-01-01T00:00:00Z",0, "2013-01-01T00:00:00Z",0, "2014-01-01T00:00:00Z",0], "gap":"+1YEAR", "start":"2006-01-01T00:00:00Z", "end":"2015-01-01T00:00:00Z"}}, "pivot":[{ "field":"inStock", "value":true, "count":8, "ranges":{ "manufacturedate_dt":{ "counts":[ "2006-01-01T00:00:00Z",6, "2007-01-01T00:00:00Z",0, "2008-01-01T00:00:00Z",0, "2009-01-01T00:00:00Z",0, "2010-01-01T00:00:00Z",0, "2011-01-01T00:00:00Z",0, "2012-01-01T00:00:00Z",0, "2013-01-01T00:00:00Z",0, "2014-01-01T00:00:00Z",0], "gap":"+1YEAR", "start":"2006-01-01T00:00:00Z", "end":"2015-01-01T00:00:00Z"}}}, ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
附加pivot參數
雖然facet.pivot.mincount與facet.mincount參數有些出入,但是許多其他的參數依然可以在pivot分析中使用:
facet.limit
facet.offset
facet.sort
facet.overrequest.count
facet.overrequest.ratio
區間分析
另外一種支持的層面分析形式是區間分析。聽起來與范圍分析很類似,也確實在功能性方面與范圍分析很像。區間分析允許你設置區間范圍和統計在這個范圍內計數。
雖然與范圍分析有類似的功能,但是兩個方法實現卻不同,而且根據上下文的不同性能也不一樣。如果你比較關心性能問題,你需要兩個都進行測試。區間分析在相同field上查詢不同區間表現良好,如果是有效字段將使用docValues,否則使用fieldCache。
facet.interval
該參數表明需要用區間分析的field。可以多次定義多個field。
facet.interval=price&facet.interval=size
1
facet.interval.set
該參數用來指明field的區間,可以定義多個。該參數是全局參數,意味著所有facet.interval定義的field都會使用該區間,除非使用特定field進行覆蓋。使用f.
f.price.facet.interval.set=[0,10]&f.price.facet.interval.set=(10,100]
1
區間語法
區間必須以’(‘或’[‘開頭,跟隨一個結束值,然后是逗號(‘,’),然后是開始值,然后以’)’或’]’結尾。
比如:
(1,10) -> 大于1,小于10
[1,10) -> 大于等于1,小于10
[1,10] -> 大于等于1,小于等于10
開始值和結束值值不能為空。如果設置無限的方位,使用特殊字符’‘作為上下或結束值。當使用’‘時,’(‘或’[‘,以及 ‘)’或’]’是沒有區別的。[,]將包含所有值。區間范圍可以使用字符串,單不需要價引號。所有的文本一直到逗號被視為開始值,然后其后的文本視為結束值。比如:[Buenos Aires,New York]。注意,類字符串的比較將使用字符串區間(區分大小寫)。比較器不能改變。
逗號、括號和方括號可以使用轉義字符’\’。在開始或結尾的空格將被忽略。開始值不能大于結束值。允許兩個值相同,這樣可以獲取你想獲取某個特定值的數量,比如[A,A]、[B,B]和[C,Z]。
區間分析支持別名。可以對facet.interval和facet.interval.set設置別名。比如:
&facet.interval={!key=popularity}some_field &facet.interval.set={!key=bad}[0,5] &facet.interval.set={!key=good}[5,*] &facet=true
1
2
3
4
層面分析局部變量
支持使用局部變量的語法覆蓋全局變量。它還可以提供一種將元數據添加到其他參數值的方法,很類似于XML屬性。
對過濾器打標簽或排除
在層面分析時,可以對指定過濾器打標簽,也可以排除某些過濾器。這在進行多選層面分析時很有用。
考慮下面這種情況:
q=mainquery&fq=status:public&fq=doctype:pdf&facet=true&facet.field=doctype
1
因為使用了過濾器doctype:pdf,所以facet.field=doctype命令是多余的,并且除了doctype:pdf其他的都將返回0.
為了對doctype進行多值查詢,GUI可能希望展示其他的docttype的值,就像是沒有doctype:pdf約束一樣。比如:
=== Document Type === [ ] Word (42) [x] PDF (96) [ ] Excel(11) [ ] HTML (63)
1
2
3
4
5
為了返回doctype的值,可以通過對過濾器打標簽,然后在對doctype層面分析時不包括這個過濾器即可。
q=mainquery&fq=status:public&fq={!tag=dt}doctype:pdf&facet=true&facet.field={!ex=dt}doctype
1
所有類型的層面分析都支持排除過濾器。tag或ex都可以使用定義多個值,不同值之間用逗號分隔。
修改輸出值
使用key可以修改層面分析命令的輸出值。比如:
facet.field={!ex=dt key=mylabel}doctype
1
在名為doctype的field上的層面分析結果返回key是mylabel。這在多次對相同field進行層面分析時比較有用。
擴展閱讀
SimpleFacetParameters
Heatmap Faceting (Spatial)
Lucene/Solr 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。