Solr 分面是根據(jù)索引術(shù)語(yǔ)將搜索結(jié)果排列成類別。
向搜索者提供索引的術(shù)語(yǔ),以及每個(gè)術(shù)語(yǔ)找到多少匹配文檔的數(shù)字計(jì)數(shù)。分面使用戶可以輕松地瀏覽搜索結(jié)果,縮小搜索結(jié)果的范圍。
控制分面有兩個(gè)通用參數(shù)。
如果設(shè)置為true
,則此參數(shù)在查詢響應(yīng)中啟用 faceting 計(jì)數(shù)。如果設(shè)置為false
,則為 blank 或丟失值,則此參數(shù)將禁用分面。除非此參數(shù)設(shè)置為true
,否則下面列出的其他參數(shù)都不起作用。默認(rèn)值為 blank(false)。
此參數(shù)允許您在 Lucene 默認(rèn)語(yǔ)法中指定任意查詢來(lái)生成 faceting 計(jì)數(shù)。
默認(rèn)情況下,Solr 的 faceting 功能會(huì)自動(dòng)確定字段的唯一術(shù)語(yǔ),并返回每個(gè)術(shù)語(yǔ)的計(jì)數(shù)。使用facet.query
,您可以覆蓋此默認(rèn)行為,并選擇您要查看哪些術(shù)語(yǔ)或表達(dá)式計(jì)算。在典型的分面實(shí)現(xiàn)中,您將指定一些facet.query
參數(shù)。此參數(shù)對(duì)基于數(shù)字范圍的分面或基于前綴的分面特別有用。
您可以多次設(shè)置該facet.query
參數(shù),以指示應(yīng)將多個(gè)查詢用作單獨(dú)的 faceting 約束。
如果您要以默認(rèn)語(yǔ)法以外的語(yǔ)法使用 faceting 查詢,請(qǐng)?jiān)?faceting 查詢前加上查詢符號(hào)的名稱。例如,要使用假設(shè)的myfunc
查詢解析器,可以像這樣設(shè)置facet.query
參數(shù):
facet.query={!myfunc}name~fred
可以使用幾個(gè)參數(shù)來(lái)根據(jù)指定字段中的索引項(xiàng)(term)來(lái)觸發(fā)分面。
在使用這些參數(shù)時(shí),務(wù)必記住在 Lucene 中 “term” 是一個(gè)非常具體的概念:它與在任何分析發(fā)生后被索引的文本字段/值對(duì)相關(guān)。對(duì)于包含詞干、小寫或單詞拆分的文本字段,所生成的 term 可能不是您所期望的。
如果您希望 Solr 對(duì)完整的文本字符串執(zhí)行分析(用于搜索)和分面,請(qǐng)使用架構(gòu)中的 copyField 指令來(lái)創(chuàng)建該字段的兩個(gè)版本:一個(gè)文本和一個(gè)字符串。確保兩者都是:indexed="true"。(有關(guān)該 copyField 指令的更多信息,請(qǐng)參閱文檔、字段和架構(gòu)設(shè)計(jì)。)
除非另有說(shuō)明,否則下面的所有參數(shù)都可以在 per-field 的基礎(chǔ)上來(lái)指定為 f.<fieldname>.facet.<parameter> 語(yǔ)法。
該facet.field
參數(shù)標(biāo)識(shí)應(yīng)該被視為一個(gè)分面的字段。它迭代該字段中的每個(gè) Term,并使用該 Term 作為約束生成一個(gè) facet 計(jì)數(shù)。此參數(shù)可以在查詢中多次指定以選擇多個(gè)分面字段。
Note:如果您未將此參數(shù)設(shè)置為架構(gòu)中的至少一個(gè)字段,則本節(jié)中介紹的其他任何參數(shù)都不會(huì)有任何影響。
這個(gè)facet.prefix
參數(shù)限制了以給定的字符串前綴開頭的那些 Term。這不會(huì)以任何方式限制查詢,只會(huì)限制查詢返回的分面。
該facet.contains
參數(shù)限制了包含給定子字符串的 term。這不會(huì)以任何方式限制查詢,只會(huì)限制查詢返回的分面。
如果使用facet.contains
,則在將給定的子字符串與候選分面 term 匹配時(shí),facet.contains.ignoreCase
參數(shù)會(huì)導(dǎo)致大小寫被忽略。
此參數(shù)確定分面字段約束的排序。
這個(gè)參數(shù)有兩個(gè)選項(xiàng):
通過(guò)計(jì)數(shù)對(duì)約束進(jìn)行排序(最高計(jì)數(shù)優(yōu)先)。
返回按其索引順序排序的約束(按索引 term 字典順序)。對(duì)于 ASCII 范圍中的 term,這將按字母順序排序。
如果facet.limit
大于 0,則默認(rèn)值為count
,否則默認(rèn)為index
。
此參數(shù)指定應(yīng)該為 facet 字段返回的約束計(jì)數(shù)的最大數(shù)量(基本上是返回的字段的分面數(shù))。負(fù)值意味著 Solr 將返回?zé)o限數(shù)量的約束計(jì)數(shù)。默認(rèn)值是100
。
該facet.offset
參數(shù)表示在允許分頁(yè)的約束列表中的偏移量。默認(rèn)值是0
。
該facet.mincount
參數(shù)指定要包括在響應(yīng)中的 facet 字段所需的最小計(jì)數(shù)。如果一個(gè)字段的計(jì)數(shù)低于最小值,則不返回字段的分面。默認(rèn)值是0
。
如果設(shè)置為true
,則此參數(shù)指示除了 facet 字段的基于 Term 的約束之外,還應(yīng)計(jì)算與查詢匹配的所有結(jié)果的計(jì)數(shù),但是該字段沒(méi)有分面值的計(jì)算應(yīng)該返回。默認(rèn)值是false
。
該facet.method
參數(shù)用于選擇面對(duì)某個(gè)字段時(shí) Solr 應(yīng)使用的算法或方法的類型。
以下方法可用:
枚舉一個(gè)字段中的所有 term,計(jì)算匹配該 term 的文檔與匹配查詢的文檔的集合交集。
建議使用此方法分割只具有少量不同值的 faceting 多值字段。每個(gè)文檔的平均值數(shù)量無(wú)關(guān)緊要。
通過(guò)循環(huán)遍歷與查詢匹配的文檔并對(duì)每個(gè)文檔中出現(xiàn)的 term 求和來(lái)計(jì)算 facet 數(shù)。
如果該字段是多值的或被標(biāo)記(根據(jù)FieldType.isTokened()
),則這當(dāng)前使用 UnInvertedField 緩存來(lái)實(shí)現(xiàn)。在緩存中查找每個(gè)文檔以查看它包含的 term/值,并為每個(gè)值遞增一個(gè)計(jì)數(shù)。
此方法適用于字段的索引值數(shù)量較多但每個(gè)文檔的值數(shù)量較少的情況。對(duì)于多值字段,使用混合方法,使用filterCache
的 term 過(guò)濾器來(lái)匹配多個(gè)文檔的 term。這些字母fc
代表字段緩存。
單值字符串字段的每段字段 faceting。啟用facet.method=fcs
并控制與threads
本地參數(shù)一起使用的線程數(shù)。此參數(shù)允許分面在快速索引更改時(shí)速度更快。
默認(rèn)值是fc
(除了使用BoolField
字段類型的字段和facet.exists=true
被請(qǐng)求時(shí)),因?yàn)樗鼉A向于使用較少的內(nèi)存,并且當(dāng)字段在索引中具有許多獨(dú)特的 term 時(shí)速度更快。
此參數(shù)指示在確定該 term 的約束計(jì)數(shù)時(shí)應(yīng)使用 filterCache 的最小文檔頻率(匹配 term 的文檔的數(shù)量)。這只用于分面的facet.method=enum
方法。
大于零的值會(huì)降低 filterCache 的內(nèi)存使用量,但會(huì)增加查詢處理所需的時(shí)間。如果在具有大量 term 的字段上分面,并且希望減少內(nèi)存使用量,請(qǐng)嘗試將此參數(shù)設(shè)置為介于25
和50
之間的值,然后運(yùn)行一些測(cè)試。然后,根據(jù)需要優(yōu)化參數(shù)設(shè)置。
默認(rèn)值是0
,導(dǎo)致 filterCache 被用于字段中的所有術(shù)語(yǔ)。
要將分面數(shù)加 1,請(qǐng)指定facet.exists=true
。該參數(shù)可以與facet.method=enum
一起使用或者省略時(shí)使用。它只能用于非字典字段(如字符串)。這可能會(huì)加速大指數(shù)或高基數(shù)面值的分面。
如果您想從分面計(jì)數(shù)中刪除 term,但將它們保留在索引中,則該facet.excludeTerms
參數(shù)允許您執(zhí)行此操作。
在某些情況下,在分布式 Solr 查詢中為某以分面返回的“top”約束的準(zhǔn)確性可以通過(guò)“過(guò)度請(qǐng)求”從每個(gè)單獨(dú)的分片中得到期望的約束(即,facet.limit)的數(shù)量來(lái)提高。在這些情況下,每個(gè)分片默認(rèn)都會(huì)被要求提供最高10 + (1.5 * facet.limit)
限制。
在某些情況下,根據(jù)您的文檔如何在您的分片中進(jìn)行分區(qū)以及您使用的facet.limit
值,您可能會(huì)發(fā)現(xiàn)增加或減少 Solr 過(guò)多請(qǐng)求的數(shù)量是有利的。這可以通過(guò)設(shè)置facet.overrequest.count
(默認(rèn)為10
)和facet.overrequest.ratio
(默認(rèn)為1.5
)參數(shù)來(lái)實(shí)現(xiàn)。
此參數(shù)將導(dǎo)致加載分面中使用的基礎(chǔ)字段與指定的線程數(shù)并行執(zhí)行。指定 facet.threads=N,其中 N 是使用的最大線程數(shù)。
忽略這個(gè)參數(shù)或者指定線程數(shù)0
不會(huì)產(chǎn)生任何線程,只會(huì)使用主請(qǐng)求線程。指定負(fù)數(shù)的線程將最多創(chuàng)建Integer.MAX_VALUE
線程。
您可以在任何日期字段或支持范圍查詢的任何數(shù)字字段上使用“范圍分面”。這對(duì)于將諸如價(jià)格之類的一系列范圍查詢(作為查詢方面)拼接在一起是特別有用的。
該facet.range
參數(shù)定義了 Solr 應(yīng)該為其創(chuàng)建范圍分面的字段。例如:
facet.range=price&facet.range=age
facet.range=lastModified_dt
該facet.range.start
參數(shù)指定范圍的下限。您可以用每個(gè)字段的語(yǔ)法來(lái)指定此參數(shù)f.<fieldname>.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
該 facet.range.end
參數(shù)指定范圍的上限。您可以用每個(gè)字段的語(yǔ)法來(lái)指定此參數(shù)f.<fieldname>.facet.range.end
。例如:
f.price.facet.range.end=1000.0&f.age.facet.range.start=99
f.lastModified_dt.facet.range.end=NOW/DAY+30DAYS
每個(gè)范圍的跨度表示為要添加到下限的值。對(duì)于日期字段,這應(yīng)該使用 DateMathParser 語(yǔ)法(如:facet.range.gap=%2B1DAY …? '+1DAY'
)來(lái)表示。您可以使用以下語(yǔ)法在每個(gè)字段的基礎(chǔ)上指定此參數(shù)f.<fieldname>.facet.range.gap
。例如:
f.price.facet.range.gap=100&f.age.facet.range.gap=10
f.lastModified_dt.facet.range.gap=+1DAY
該facet.range.hardend
參數(shù)是一個(gè)布爾參數(shù),它指定 Solr 如何處理 facet.range.gap 不能在 facet.range.start 和 facet.range.end 之間平均分配的情況。
如果為true
,則最后一個(gè)范圍約束將facet.range.end
值作為上限的。如果為false
,則最后一個(gè)范圍將有最小可能的上限,然后是facet.range.end
,這個(gè)范圍就是指定范圍間隙的確切寬度。此參數(shù)的默認(rèn)值為 false。
該參數(shù)可以使用f.<fieldname>.facet.range.hardend
語(yǔ)法在每個(gè)字段的基礎(chǔ)上指定。
默認(rèn)情況下,用于計(jì)算facet.range.start
和facet.range.end
之間的范圍分面的區(qū)域包括它們的下界的和排他性的上界。用facet.range.other
參數(shù)定義的“before”范圍是排他性的,“l(fā)ater”范圍是包含性的。這個(gè)默認(rèn)值,相當(dāng)于下面的“l(fā)ower”,不會(huì)導(dǎo)致在邊界上重復(fù)計(jì)數(shù)。您可以使用facet.range.include
參數(shù)來(lái)修改此行為,方法如下:
lower
:所有基于 gap 的范圍包括它們的下限。
upper
:所有基于 gap 的范圍包括它們的上限。
edge
:即使未指定相應(yīng)的 upper/lower 選項(xiàng),第一個(gè)和最后一個(gè) gap 范圍也包括它們的邊界界限(第一個(gè)的下限和第二個(gè)的上限)。
outer
:“before”和“l(fā)ater”范圍將包括其邊界,即使第一個(gè)或最后一個(gè)范圍已經(jīng)包含這些邊界。
all
:包括所有選項(xiàng):lower
,upper
,edge
,和outer
。
您可以使用f.<fieldname>.facet.range.include
語(yǔ)法在每個(gè)字段上指定此參數(shù),并且可以多次指定它以指示多個(gè)選項(xiàng)。
為了確保您避免重復(fù)計(jì)算,不要同時(shí)選擇lower
和upper
,不要選擇outer
,也不要選擇all
。
該facet.range.other
參數(shù)指定除了facet.range.start
和facet.range.end
之間的每個(gè)范圍約束的計(jì)數(shù)外,還應(yīng)計(jì)算這些選項(xiàng)的計(jì)數(shù):
before
:所有具有字段值的記錄都低于第一個(gè)范圍的下限。
after
:所有具有字段值的記錄都大于最后一個(gè)范圍的上限。
between
:所有具有字段值的記錄都在所有范圍的開始和結(jié)束邊界之間。
none
:不要計(jì)算任何計(jì)數(shù)。
all
:計(jì)算 before,between 和 later 的計(jì)數(shù)。
這個(gè)參數(shù)可以用每個(gè)字段的f.<fieldname>.facet.range.other
語(yǔ)法來(lái)指定,除了all
選項(xiàng)外,這個(gè)參數(shù)可以被多次指定來(lái)指示多個(gè)選項(xiàng),但是none
會(huì)覆蓋所有其他的選項(xiàng)。
該facet.range.method
參數(shù)選擇 Solr 應(yīng)用于范圍分面的算法或方法的類型。這兩種方法產(chǎn)生相同的結(jié)果,但性能可能會(huì)有所不同。
此方法根據(jù)其他 facet.range 參數(shù)生成范圍,并為每個(gè)參數(shù)執(zhí)行一個(gè)過(guò)濾器,稍后與主查詢結(jié)果集相交以獲取計(jì)數(shù)。它將使用 filterCache,所以它將有足夠大的緩存來(lái)包含所有的范圍。
此方法循環(huán)遍歷與主查詢匹配的文檔,并為每個(gè)文檔找到該值的正確范圍。此方法將使用 docValues(如果為字段啟用)或 fieldCache。該dv
方法不支持字段類型DateRangeField 或使用 group.facets。
該參數(shù)的默認(rèn)值是filter
。
日期范圍和時(shí)區(qū):分面上的日期字段是一個(gè)常見(jiàn)的情況,該TZ
參數(shù)可用于確保 "每天的分面計(jì)數(shù)" 或 "每月的分面計(jì)數(shù)" 基于有意義的定義,對(duì)于給定的日期/月份,"starts" 與特定時(shí)區(qū)相關(guān)。
有關(guān)詳細(xì)信息, 請(qǐng)參閱 "使用日期" 部分中的示例。
該 facet.mincount 參數(shù)與字段分面中使用的相同,也適用于范圍刻面。使用時(shí),響應(yīng)中將不包括低于最小值的范圍。
透視(Pivoting)是一種匯總工具,可讓您自動(dòng)對(duì)表中存儲(chǔ)的數(shù)據(jù)進(jìn)行排序、計(jì)數(shù)、匯總或平均值。結(jié)果通常顯示在顯示匯總數(shù)據(jù)的第二個(gè)表格中。Pivot 分面可以讓您通過(guò)多個(gè)字段創(chuàng)建分面文檔的結(jié)果匯總表。
另一種看待問(wèn)題的方式是查詢產(chǎn)生一個(gè)決策樹,因?yàn)?Solr 告訴您“關(guān)于分面 A,約束/計(jì)數(shù)是:X/N,Y/M 等等。如果您用 X 來(lái)約束A,那么 B 的約束計(jì)數(shù)將是 S/P,T/Q等“。換句話說(shuō),如果從當(dāng)前分面結(jié)果中應(yīng)用一個(gè)約束,它會(huì)事先告訴您什么是“下一個(gè)”分面結(jié)果集。
該facet.pivot
參數(shù)定義了用于 pivot 的字段。多個(gè)facet.pivot
值將在響應(yīng)中創(chuàng)建多個(gè) “facet_pivot” 部分。用逗號(hào)分隔每個(gè)字段列表。
該facet.pivot.mincount
參數(shù)定義了為了將分面包括在結(jié)果中而需要匹配的文檔的最小數(shù)目。默認(rèn)值是 1。
使用 “bin / solr -e techproducts” 示例,像這樣的查詢 URL 將返回下面的數(shù)據(jù),并在 “facet_pivot” 部分中找到 pivot 分面結(jié)果:
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&facet.pivot.mincount=2
{ "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}]}]
}]}}}
除了一些其他類型的分面所支持的一般局部參數(shù)外,一個(gè) stats 局部參數(shù)可以和 facet.pivot 一起使用來(lái)指向 stats.field 實(shí)例(通過(guò)標(biāo)簽),即,您想計(jì)算每個(gè)支點(diǎn)約束(Pivot Constraint)。
在下面的示例中,為每個(gè) facet.pivot 結(jié)果層次結(jié)構(gòu)計(jì)算兩個(gè)不同(重疊)的統(tǒng)計(jì)信息集合:
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
結(jié)果如下:
{"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}}}}],
"..."}]}}}}]}]}}
query 本地參數(shù)可以與 facet.pivot 一起使用,來(lái)指代 facet.query 應(yīng)計(jì)算每個(gè)支點(diǎn)(pivot)約束的實(shí)例(按標(biāo)簽)。同樣,range 本地參數(shù)也可以與 facet.pivot 一起使用以指向facet.range 實(shí)例。
在下面的例子中,兩個(gè)查詢分面用來(lái)計(jì)算 facet.pivot 結(jié)果層次結(jié)構(gòu)的 h:
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
{"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
}
},
"..."]}]}}}
以類似的方式,在下面的示例中,為每個(gè) facet.pivot 結(jié)果層次計(jì)算兩個(gè)范圍分面:
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
結(jié)果如下:
{"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"}}},
"..."]}]}}}
雖然 facet.pivot.mincount 名稱與 facet.mincount 字段分面使用的參數(shù)有所不同,但上面介紹的許多分面參數(shù)也可用于 pivot 分面:
另一種支持的分面形式是區(qū)間分面。這聽起來(lái)類似于范圍分面,但是功能更接近于使用范圍查詢進(jìn)行分面查詢。區(qū)間分面允許您設(shè)置可變區(qū)間并計(jì)算在指定字段中具有這些間隔內(nèi)的值的文檔的數(shù)量。
即使通過(guò)在范圍查詢中使用分面查詢可以實(shí)現(xiàn)相同的功能,但這兩種方法的實(shí)現(xiàn)是非常不同的,并且將根據(jù)上下文提供不同的性能。
如果您擔(dān)心搜索的性能,則應(yīng)使用這兩個(gè)選項(xiàng)進(jìn)行測(cè)試。對(duì)于相同的字段,區(qū)間分面往往會(huì)有多個(gè)時(shí)間間隔,而在過(guò)濾器緩存更有效的環(huán)境(例如靜態(tài)索引)中,分面查詢傾向于更好。
如果為該字段啟用了區(qū)間分面,此方法將使用 docValues,否則將使用 fieldCache。
使用這些參數(shù)進(jìn)行區(qū)間分面:
此參數(shù)指示必須應(yīng)用區(qū)間分面的字段。它可以在同一請(qǐng)求中多次使用以指示多個(gè)字段。
facet.interval=price&facet.interval=size
此參數(shù)用于設(shè)置字段的時(shí)間間隔,可以多次指定,以指示多個(gè)時(shí)間間隔。這個(gè)參數(shù)是全局性的,這意味著它將被用于指定的所有字段,使用facet.interval
,除非有特定字段的覆蓋。如果要覆蓋特定字段上的此參數(shù),可以使用:f.<fieldname>.facet.interval.set
例如:
f.price.facet.interval.set=[0,10]&f.price.facet.interval.set=(10,100]
區(qū)間必須以'(' 或 '[' 開頭,然后是逗號(hào)(','),最終值,最后是 ')' 或']'。
例如:
初始值和結(jié)束值不能為空。
如果間隔需要是無(wú)限的,則特殊字符 * 可以用于開始和結(jié)束,限制。使用此特殊字符時(shí),開始語(yǔ)法選項(xiàng)((和[)和結(jié)束語(yǔ)法選項(xiàng)()和])將被視為相同。[*,*]將包括所有在該領(lǐng)域具有價(jià)值的文件。
間隔限制可以是字符串,但不需要添加引號(hào)。所有的文本,直到逗號(hào)將被視為起始限制,并在此之后的文本將是最終限制。例如:[Buenos Aires,New York]。請(qǐng)記住,會(huì)進(jìn)行類似字符串的比較來(lái)匹配字符串間隔中的文檔(區(qū)分大小寫)。比較器不能改變。
逗號(hào),括號(hào)和方括號(hào)可以通過(guò)在其前面使用 \ 而被轉(zhuǎn)義。值之前和之后的空格將被省略。
起始限制不能超過(guò)最終限制。等于限制是允許的,這允許您指示要計(jì)數(shù)的特定值:[A,A],[B,B]和[C,Z]。
區(qū)間分面支持下面介紹的輸出鍵更換。輸出鍵可以在 facet.interval 參數(shù)和 facet.interval.set 參數(shù)中被替換。例如:
&facet.interval={!key=popularity}some_field
&facet.interval.set={!key=bad}[0,5]
&facet.interval.set={!key=good}[5,*]
&facet=true
該 LocalParams 語(yǔ)法允許壓倒一切的全局設(shè)置。它也可以提供一種向其他參數(shù)值添加元數(shù)據(jù)的方法,就像 XML 屬性一樣。
您可以標(biāo)記特定的過(guò)濾器,并在分面時(shí)排除這些過(guò)濾器。這在做多選分面時(shí)很有用。
請(qǐng)考慮以下具有分面的示例查詢:
q=mainquery&fq=status:public&fq=doctype:pdf&facet=true&facet.field=doctype
因?yàn)橐磺卸家呀?jīng)被過(guò)濾器 doctype:pdf 約束了,所以 facet.field=doctypefacet 命令現(xiàn)在是多余的,并且除了 doctype:pdf 外一切都會(huì)返回 0 個(gè)計(jì)數(shù)。
為了實(shí)現(xiàn) doctype 的多重選擇方面,GUI 可能還想顯示其他 doctype 類型值及其關(guān)聯(lián)計(jì)數(shù),就好像 doctype:pdf 約束還沒(méi)有被應(yīng)用。例如:
=== Document Type ===
[ ] Word (42)
[x] PDF (96)
[ ] Excel(11)
[ ] HTML (63)
要返回當(dāng)前未選中的 doctype 值的計(jì)數(shù),請(qǐng)直接約束 doctype 的標(biāo)記篩選器,并在 DOCTYPE 上分面時(shí)排除這些過(guò)濾器。
q=mainquery&fq=status:public&fq={!tag=dt}doctype:pdf&facet=true&facet.field={!ex=dt}doctype
所有類型的分面都支持過(guò)濾排除。無(wú)論是 tag 和 ex 本地參數(shù)都可以通過(guò)用逗號(hào)分隔指定多個(gè)值。
要更改分面命令的輸出鍵,請(qǐng)使用 key 本地參數(shù)指定一個(gè)新名稱。例如:
facet.field={!ex=dt key=mylabel}doctype
上面的參數(shù)設(shè)置會(huì)導(dǎo)致 “doctype” 字段的字段分面結(jié)果在響應(yīng)中使用鍵 “mylabel” 而不是 “doctype” 返回。當(dāng)在不同的排除情況下多次對(duì)同一個(gè)字段進(jìn)行排列時(shí),這會(huì)很有幫助。
要用某些 term 限制字段分面,請(qǐng)使用逗號(hào)分隔 terms 本地參數(shù)。逗號(hào)和引號(hào)可以用反斜線來(lái)轉(zhuǎn)義,如 \,。在這種情況下,facet 的計(jì)算方式類似于 facet.method=enum 但忽略facet.enum.cache.minDf。例如:
facet.field={!terms='alfa,betta,with\,with\',with space'}symbol
更多建議: