Solr分面搜索(Faceting)及其參數(shù)介紹

2018-11-27 18:48 更新

Faceting

Solr 分面是根據(jù)索引術(shù)語將搜索結(jié)果排列成類別。

向搜索者提供索引的術(shù)語,以及每個術(shù)語找到多少匹配文檔的數(shù)字計數(shù)。分面使用戶可以輕松地瀏覽搜索結(jié)果,縮小搜索結(jié)果的范圍。

通用的分面參數(shù)

控制分面有兩個通用參數(shù)。

  • facet 參數(shù)

    如果設(shè)置為true,則此參數(shù)在查詢響應(yīng)中啟用 faceting 計數(shù)。如果設(shè)置為false,則為 blank 或丟失值,則此參數(shù)將禁用分面。除非此參數(shù)設(shè)置為true,否則下面列出的其他參數(shù)都不起作用。默認值為 blank(false)。

  • facet.query 參數(shù)

    此參數(shù)允許您在 Lucene 默認語法中指定任意查詢來生成 faceting 計數(shù)。

    默認情況下,Solr 的 faceting 功能會自動確定字段的唯一術(shù)語,并返回每個術(shù)語的計數(shù)。使用facet.query,您可以覆蓋此默認行為,并選擇您要查看哪些術(shù)語或表達式計算。在典型的分面實現(xiàn)中,您將指定一些facet.query參數(shù)。此參數(shù)對基于數(shù)字范圍的分面或基于前綴的分面特別有用。

    您可以多次設(shè)置該facet.query參數(shù),以指示應(yīng)將多個查詢用作單獨的 faceting 約束。

    如果您要以默認語法以外的語法使用 faceting 查詢,請在 faceting 查詢前加上查詢符號的名稱。例如,要使用假設(shè)的myfunc查詢解析器,可以像這樣設(shè)置facet.query參數(shù):

    facet.query={!myfunc}name~fred

字段值分面參數(shù)

可以使用幾個參數(shù)來根據(jù)指定字段中的索引項(term)來觸發(fā)分面。

在使用這些參數(shù)時,務(wù)必記住在 Lucene 中 “term” 是一個非常具體的概念:它與在任何分析發(fā)生后被索引的文本字段/值對相關(guān)。對于包含詞干、小寫或單詞拆分的文本字段,所生成的 term 可能不是您所期望的。

如果您希望 Solr 對完整的文本字符串執(zhí)行分析(用于搜索)和分面,請使用架構(gòu)中的 copyField 指令來創(chuàng)建該字段的兩個版本:一個文本和一個字符串。確保兩者都是:indexed="true"。(有關(guān)該 copyField 指令的更多信息,請參閱文檔、字段和架構(gòu)設(shè)計。)

除非另有說明,否則下面的所有參數(shù)都可以在 per-field 的基礎(chǔ)上來指定為 f.<fieldname>.facet.<parameter> 語法。

  • facet.field 參數(shù)

    facet.field參數(shù)標識應(yīng)該被視為一個分面的字段。它迭代該字段中的每個 Term,并使用該 Term 作為約束生成一個 facet 計數(shù)。此參數(shù)可以在查詢中多次指定以選擇多個分面字段。

    Note:如果您未將此參數(shù)設(shè)置為架構(gòu)中的至少一個字段,則本節(jié)中介紹的其他任何參數(shù)都不會有任何影響。

  • facet.prefix 參數(shù)

    這個facet.prefix參數(shù)限制了以給定的字符串前綴開頭的那些 Term。這不會以任何方式限制查詢,只會限制查詢返回的分面。

  • facet.contains 參數(shù)

    facet.contains參數(shù)限制了包含給定子字符串的 term。這不會以任何方式限制查詢,只會限制查詢返回的分面。

  • facet.contains.ignoreCase 參數(shù)

    如果使用facet.contains,則在將給定的子字符串與候選分面 term 匹配時,facet.contains.ignoreCase參數(shù)會導(dǎo)致大小寫被忽略。

  • facet.sort 參數(shù)

    此參數(shù)確定分面字段約束的排序。

    這個參數(shù)有兩個選項:

    • count

      通過計數(shù)對約束進行排序(最高計數(shù)優(yōu)先)。

    • index

      返回按其索引順序排序的約束(按索引 term 字典順序)。對于 ASCII 范圍中的 term,這將按字母順序排序。

    如果facet.limit大于 0,則默認值為count,否則默認為index

  • facet.limit 參數(shù)

    此參數(shù)指定應(yīng)該為 facet 字段返回的約束計數(shù)的最大數(shù)量(基本上是返回的字段的分面數(shù))。負值意味著 Solr 將返回?zé)o限數(shù)量的約束計數(shù)。默認值是100。

  • facet.offset 參數(shù)

    facet.offset參數(shù)表示在允許分頁的約束列表中的偏移量。默認值是0。

  • facet.mincount 參數(shù)

    facet.mincount參數(shù)指定要包括在響應(yīng)中的 facet 字段所需的最小計數(shù)。如果一個字段的計數(shù)低于最小值,則不返回字段的分面。默認值是0。

  • facet.missing 參數(shù)

    如果設(shè)置為true,則此參數(shù)指示除了 facet 字段的基于 Term 的約束之外,還應(yīng)計算與查詢匹配的所有結(jié)果的計數(shù),但是該字段沒有分面值的計算應(yīng)該返回。默認值是false。

  • facet.method 參數(shù)

    facet.method參數(shù)用于選擇面對某個字段時 Solr 應(yīng)使用的算法或方法的類型。

    以下方法可用:

    • enum

      枚舉一個字段中的所有 term,計算匹配該 term 的文檔與匹配查詢的文檔的集合交集。

      建議使用此方法分割只具有少量不同值的 faceting 多值字段。每個文檔的平均值數(shù)量無關(guān)緊要。

    • fc

      通過循環(huán)遍歷與查詢匹配的文檔并對每個文檔中出現(xiàn)的 term 求和來計算 facet 數(shù)。

      如果該字段是多值的或被標記(根據(jù)FieldType.isTokened()),則這當(dāng)前使用 UnInvertedField 緩存來實現(xiàn)。在緩存中查找每個文檔以查看它包含的 term/值,并為每個值遞增一個計數(shù)。

      此方法適用于字段的索引值數(shù)量較多但每個文檔的值數(shù)量較少的情況。對于多值字段,使用混合方法,使用filterCache的 term 過濾器來匹配多個文檔的 term。這些字母fc代表字段緩存。

    • fcs

      單值字符串字段的每段字段 faceting。啟用facet.method=fcs并控制與threads本地參數(shù)一起使用的線程數(shù)。此參數(shù)允許分面在快速索引更改時速度更快。

    默認值是fc(除了使用BoolField字段類型的字段和facet.exists=true被請求時),因為它傾向于使用較少的內(nèi)存,并且當(dāng)字段在索引中具有許多獨特的 term 時速度更快。

  • facet.enum.cache.minDf 參數(shù)

    此參數(shù)指示在確定該 term 的約束計數(shù)時應(yīng)使用 filterCache 的最小文檔頻率(匹配 term 的文檔的數(shù)量)。這只用于分面的facet.method=enum方法。

  • 大于零的值會降低 filterCache 的內(nèi)存使用量,但會增加查詢處理所需的時間。如果在具有大量 term 的字段上分面,并且希望減少內(nèi)存使用量,請嘗試將此參數(shù)設(shè)置為介于2550之間的值,然后運行一些測試。然后,根據(jù)需要優(yōu)化參數(shù)設(shè)置。

    默認值是0,導(dǎo)致 filterCache 被用于字段中的所有術(shù)語。

  • facet.exists 參數(shù)

    要將分面數(shù)加 1,請指定facet.exists=true。該參數(shù)可以與facet.method=enum一起使用或者省略時使用。它只能用于非字典字段(如字符串)。這可能會加速大指數(shù)或高基數(shù)面值的分面。

  • facet.excludeTerms 參數(shù)

    如果您想從分面計數(shù)中刪除 term,但將它們保留在索引中,則該facet.excludeTerms參數(shù)允許您執(zhí)行此操作。

  • facet.overrequest.count 和 facet.overrequest.ratio 參數(shù)

    在某些情況下,在分布式 Solr 查詢中為某以分面返回的“top”約束的準確性可以通過“過度請求”從每個單獨的分片中得到期望的約束(即,facet.limit)的數(shù)量來提高。在這些情況下,每個分片默認都會被要求提供最高10 + (1.5 * facet.limit)限制。

    在某些情況下,根據(jù)您的文檔如何在您的分片中進行分區(qū)以及您使用的facet.limit值,您可能會發(fā)現(xiàn)增加或減少 Solr 過多請求的數(shù)量是有利的。這可以通過設(shè)置facet.overrequest.count(默認為10)和facet.overrequest.ratio(默認為1.5)參數(shù)來實現(xiàn)。

  • facet.threads 參數(shù)

    此參數(shù)將導(dǎo)致加載分面中使用的基礎(chǔ)字段與指定的線程數(shù)并行執(zhí)行。指定 facet.threads=N,其中 N 是使用的最大線程數(shù)。

    忽略這個參數(shù)或者指定線程數(shù)0不會產(chǎn)生任何線程,只會使用主請求線程。指定負數(shù)的線程將最多創(chuàng)建Integer.MAX_VALUE線程。

范圍分面(Range Faceting)

您可以在任何日期字段或支持范圍查詢的任何數(shù)字字段上使用“范圍分面”。這對于將諸如價格之類的一系列范圍查詢(作為查詢方面)拼接在一起是特別有用的。

  • facet.range 參數(shù)

    facet.range參數(shù)定義了 Solr 應(yīng)該為其創(chuàng)建范圍分面的字段。例如:

    facet.range=price&facet.range=age
    facet.range=lastModified_dt
  • facet.range.start 參數(shù)

    facet.range.start參數(shù)指定范圍的下限。您可以用每個字段的語法來指定此參數(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ù)

    該 facet.range.end參數(shù)指定范圍的上限。您可以用每個字段的語法來指定此參數(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
  • facet.range.gap 參數(shù)

    每個范圍的跨度表示為要添加到下限的值。對于日期字段,這應(yīng)該使用 DateMathParser 語法(如:facet.range.gap=%2B1DAY …? '+1DAY')來表示。您可以使用以下語法在每個字段的基礎(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ù)

    facet.range.hardend參數(shù)是一個布爾參數(shù),它指定 Solr 如何處理 facet.range.gap 不能在 facet.range.start 和 facet.range.end 之間平均分配的情況。

    如果為true,則最后一個范圍約束將facet.range.end值作為上限的。如果為false,則最后一個范圍將有最小可能的上限,然后是facet.range.end,這個范圍就是指定范圍間隙的確切寬度。此參數(shù)的默認值為 false。

    該參數(shù)可以使用f.<fieldname>.facet.range.hardend語法在每個字段的基礎(chǔ)上指定。

  • facet.range.include 參數(shù)

    默認情況下,用于計算facet.range.startfacet.range.end之間的范圍分面的區(qū)域包括它們的下界的和排他性的上界。用facet.range.other參數(shù)定義的“before”范圍是排他性的,“l(fā)ater”范圍是包含性的。這個默認值,相當(dāng)于下面的“l(fā)ower”,不會導(dǎo)致在邊界上重復(fù)計數(shù)。您可以使用facet.range.include參數(shù)來修改此行為,方法如下:

    • lower:所有基于 gap 的范圍包括它們的下限。

    • upper:所有基于 gap 的范圍包括它們的上限。

    • edge:即使未指定相應(yīng)的 upper/lower 選項,第一個和最后一個 gap 范圍也包括它們的邊界界限(第一個的下限和第二個的上限)。

    • outer:“before”和“l(fā)ater”范圍將包括其邊界,即使第一個或最后一個范圍已經(jīng)包含這些邊界。

    • all:包括所有選項:lower,upperedge,和outer

    您可以使用f.<fieldname>.facet.range.include語法在每個字段上指定此參數(shù),并且可以多次指定它以指示多個選項。

    為了確保您避免重復(fù)計算,不要同時選擇lowerupper,不要選擇outer,也不要選擇all

  • facet.range.other 參數(shù)

    facet.range.other參數(shù)指定除了facet.range.startfacet.range.end之間的每個范圍約束的計數(shù)外,還應(yīng)計算這些選項的計數(shù):

    • before:所有具有字段值的記錄都低于第一個范圍的下限。

    • after:所有具有字段值的記錄都大于最后一個范圍的上限。

    • between:所有具有字段值的記錄都在所有范圍的開始和結(jié)束邊界之間。

    • none:不要計算任何計數(shù)。

    • all:計算 before,between 和 later 的計數(shù)。

    這個參數(shù)可以用每個字段的f.<fieldname>.facet.range.other語法來指定,除了all選項外,這個參數(shù)可以被多次指定來指示多個選項,但是none會覆蓋所有其他的選項。

  • facet.range.method 參數(shù)

    facet.range.method參數(shù)選擇 Solr 應(yīng)用于范圍分面的算法或方法的類型。這兩種方法產(chǎn)生相同的結(jié)果,但性能可能會有所不同。

    • 過濾

      此方法根據(jù)其他 facet.range 參數(shù)生成范圍,并為每個參數(shù)執(zhí)行一個過濾器,稍后與主查詢結(jié)果集相交以獲取計數(shù)。它將使用 filterCache,所以它將有足夠大的緩存來包含所有的范圍。

    • DV

      此方法循環(huán)遍歷與主查詢匹配的文檔,并為每個文檔找到該值的正確范圍。此方法將使用 docValues(如果為字段啟用)或 fieldCache。該dv方法不支持字段類型DateRangeField 或使用 group.facets。

    該參數(shù)的默認值是filter。

    日期范圍和時區(qū):分面上的日期字段是一個常見的情況,該TZ參數(shù)可用于確保 "每天的分面計數(shù)" 或 "每月的分面計數(shù)" 基于有意義的定義,對于給定的日期/月份,"starts" 與特定時區(qū)相關(guān)。

    有關(guān)詳細信息, 請參閱 "使用日期" 部分中的示例。

范圍分面中的 facet.mincount 

該 facet.mincount 參數(shù)與字段分面中使用的相同,也適用于范圍刻面。使用時,響應(yīng)中將不包括低于最小值的范圍。

支點(決策樹)分面

透視(Pivoting)是一種匯總工具,可讓您自動對表中存儲的數(shù)據(jù)進行排序、計數(shù)、匯總或平均值。結(jié)果通常顯示在顯示匯總數(shù)據(jù)的第二個表格中。Pivot 分面可以讓您通過多個字段創(chuàng)建分面文檔的結(jié)果匯總表。

另一種看待問題的方式是查詢產(chǎn)生一個決策樹,因為 Solr 告訴您“關(guān)于分面 A,約束/計數(shù)是:X/N,Y/M 等等。如果您用 X 來約束A,那么 B 的約束計數(shù)將是 S/P,T/Q等“。換句話說,如果從當(dāng)前分面結(jié)果中應(yīng)用一個約束,它會事先告訴您什么是“下一個”分面結(jié)果集。

  • facet.pivot 參數(shù)

    facet.pivot參數(shù)定義了用于 pivot 的字段。多個facet.pivot值將在響應(yīng)中創(chuàng)建多個 “facet_pivot” 部分。用逗號分隔每個字段列表。

  • facet.pivot.mincount 參數(shù)

    facet.pivot.mincount參數(shù)定義了為了將分面包括在結(jié)果中而需要匹配的文檔的最小數(shù)目。默認值是 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}]}]
    }]}}}

統(tǒng)計組件與支點(Pivot)相結(jié)合

除了一些其他類型的分面所支持的一般局部參數(shù)外,一個 stats 局部參數(shù)可以和 facet.pivot 一起使用來指向 stats.field 實例(通過標簽),即,您想計算每個支點約束(Pivot Constraint)。

在下面的示例中,為每個 facet.pivot 結(jié)果層次結(jié)構(gòu)計算兩個不同(重疊)的統(tǒng)計信息集合:

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}}}}],
      "..."}]}}}}]}]}}

將 Facet 查詢和 Facet 范圍與 Pivot 分面相結(jié)合

query 本地參數(shù)可以與 facet.pivot 一起使用,來指代 facet.query 應(yīng)計算每個支點(pivot)約束的實例(按標簽)。同樣,range 本地參數(shù)也可以與 facet.pivot 一起使用以指向facet.range 實例。

在下面的例子中,兩個查詢分面用來計算 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
              }
            },
            "..."]}]}}}

以類似的方式,在下面的示例中,為每個 facet.pivot 結(jié)果層次計算兩個范圍分面:

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"}}},
                  "..."]}]}}}

額外的支點(Pivot)參數(shù)

雖然 facet.pivot.mincount 名稱與 facet.mincount 字段分面使用的參數(shù)有所不同,但上面介紹的許多分面參數(shù)也可用于 pivot 分面:

  • facet.limit
  • facet.offset
  • facet.sort
  • facet.overrequest.count
  • facet.overrequest.ratio

區(qū)間分面

另一種支持的分面形式是區(qū)間分面。這聽起來類似于范圍分面,但是功能更接近于使用范圍查詢進行分面查詢。區(qū)間分面允許您設(shè)置可變區(qū)間并計算在指定字段中具有這些間隔內(nèi)的值的文檔的數(shù)量。

即使通過在范圍查詢中使用分面查詢可以實現(xiàn)相同的功能,但這兩種方法的實現(xiàn)是非常不同的,并且將根據(jù)上下文提供不同的性能。

如果您擔(dān)心搜索的性能,則應(yīng)使用這兩個選項進行測試。對于相同的字段,區(qū)間分面往往會有多個時間間隔,而在過濾器緩存更有效的環(huán)境(例如靜態(tài)索引)中,分面查詢傾向于更好。

如果為該字段啟用了區(qū)間分面,此方法將使用 docValues,否則將使用 fieldCache。

使用這些參數(shù)進行區(qū)間分面:

  • facet.interval 參數(shù)

    此參數(shù)指示必須應(yīng)用區(qū)間分面的字段。它可以在同一請求中多次使用以指示多個字段。

    facet.interval=price&facet.interval=size
  • facet.interval.set 參數(shù)

    此參數(shù)用于設(shè)置字段的時間間隔,可以多次指定,以指示多個時間間隔。這個參數(shù)是全局性的,這意味著它將被用于指定的所有字段,使用facet.interval,除非有特定字段的覆蓋。如果要覆蓋特定字段上的此參數(shù),可以使用:f.<fieldname>.facet.interval.set例如:

    f.price.facet.interval.set=[0,10]&f.price.facet.interval.set=(10,100]

區(qū)間語法

區(qū)間必須以'(' 或 '[' 開頭,然后是逗號(','),最終值,最后是 ')' 或']'。

例如:

  • (1,10) - 將包含大于1且小于10的值
  • [1,10] -  將包含大于或等于1且小于10的值
  • [1,10] -  將包含大于等于1且小于等于10的值

初始值和結(jié)束值不能為空。

如果間隔需要是無限的,則特殊字符 * 可以用于開始和結(jié)束,限制。使用此特殊字符時,開始語法選項((和[)和結(jié)束語法選項()和])將被視為相同。[*,*]將包括所有在該領(lǐng)域具有價值的文件。

間隔限制可以是字符串,但不需要添加引號。所有的文本,直到逗號將被視為起始限制,并在此之后的文本將是最終限制。例如:[Buenos Aires,New York]。請記住,會進行類似字符串的比較來匹配字符串間隔中的文檔(區(qū)分大小寫)。比較器不能改變。

逗號,括號和方括號可以通過在其前面使用 \ 而被轉(zhuǎn)義。值之前和之后的空格將被省略。

起始限制不能超過最終限制。等于限制是允許的,這允許您指示要計數(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

分面的本地參數(shù)

該 LocalParams 語法允許壓倒一切的全局設(shè)置。它也可以提供一種向其他參數(shù)值添加元數(shù)據(jù)的方法,就像 XML 屬性一樣。

標記(Tagging)和排除(Excluding)過濾器

您可以標記特定的過濾器,并在分面時排除這些過濾器。這在做多選分面時很有用。

請考慮以下具有分面的示例查詢:

q=mainquery&fq=status:public&fq=doctype:pdf&facet=true&facet.field=doctype

因為一切都已經(jīng)被過濾器 doctype:pdf 約束了,所以 facet.field=doctypefacet 命令現(xiàn)在是多余的,并且除了 doctype:pdf 外一切都會返回 0 個計數(shù)。

為了實現(xiàn) doctype 的多重選擇方面,GUI 可能還想顯示其他 doctype 類型值及其關(guān)聯(lián)計數(shù),就好像 doctype:pdf 約束還沒有被應(yīng)用。例如:

=== Document Type ===
  [ ] Word (42)
  [x] PDF  (96)
  [ ] Excel(11)
  [ ] HTML (63)

要返回當(dāng)前未選中的 doctype 值的計數(shù),請直接約束 doctype 的標記篩選器,并在 DOCTYPE 上分面時排除這些過濾器。

q=mainquery&fq=status:public&fq={!tag=dt}doctype:pdf&facet=true&facet.field={!ex=dt}doctype

所有類型的分面都支持過濾排除。無論是 tag 和 ex 本地參數(shù)都可以通過用逗號分隔指定多個值。

更改輸出鍵

要更改分面命令的輸出鍵,請使用 key 本地參數(shù)指定一個新名稱。例如:

facet.field={!ex=dt key=mylabel}doctype

上面的參數(shù)設(shè)置會導(dǎo)致 “doctype” 字段的字段分面結(jié)果在響應(yīng)中使用鍵 “mylabel” 而不是 “doctype” 返回。當(dāng)在不同的排除情況下多次對同一個字段進行排列時,這會很有幫助。

限制某些 Term 的分面

要用某些 term 限制字段分面,請使用逗號分隔 terms 本地參數(shù)。逗號和引號可以用反斜線來轉(zhuǎn)義,如 \,。在這種情況下,facet 的計算方式類似于 facet.method=enum 但忽略facet.enum.cache.minDf。例如:

facet.field={!terms='alfa,betta,with\,with\',with space'}symbol
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號