分面

分面是根据索引术语将搜索结果分类排列。

搜索者会看到索引术语,以及每个术语找到多少匹配文档的数字计数。分面使用户能够轻松浏览搜索结果,缩小范围,准确找到他们正在寻找的结果。

另请参阅 JSON 分面 API 以了解另一种方法。

通用分面参数

有两个通用参数用于控制分面。

facet

必需

默认值:false

如果设置为 true,此参数将在查询响应中启用分面计数。如果设置为 false、空白或缺失值,此参数将禁用分面。除非此参数设置为 true,否则下面列出的其他参数均不会产生任何效果。

facet.query

可选

默认值:无

此参数允许你在 Lucene 默认语法中指定一个任意查询以生成分面计数。

默认情况下,Solr 的分面功能会自动确定某个字段的唯一词条,并返回这些词条的计数。使用 facet.query,你可以覆盖此默认行为,并准确选择要计数的词条或表达式。在分面的典型实现中,你将指定多个 facet.query 参数。此参数对于基于数字范围的分面或基于前缀的分面特别有用。

你可以多次设置 facet.query 参数,以指示应将多个查询用作单独的分面约束。

要在除默认语法之外的其他语法中使用分面查询,请在分面查询前加上查询表示法的名称。例如,要使用假设的 myfunc 查询解析器,你可以像这样设置 facet.query 参数

facet.query={!myfunc}name~fred

字段值分面参数

可以使用多个参数来触发基于字段中已编制索引的词条的分面。

使用这些参数时,重要的是要记住“词条”是 Lucene 中一个非常具体的概念:它与在进行任何分析后编制索引的文字字段/值对有关。对于包含词干提取、小写或单词拆分的文本字段,产生的词条可能不是你期望的。

如果你希望 Solr 对完整的文字字符串执行分析(用于搜索)和分面,请在架构中使用 copyField 指令创建该字段的两个版本:一个文本版本和一个字符串版本。如果文本字段用于搜索而非分面,则应具有 indexed="true" docValues="false";如果字符串字段用于分面而非搜索,则应具有 indexed="false" docValues="true"。(有关 copyField 指令的更多信息,请参阅复制字段。)

除非另有说明,否则可以使用 f.<fieldname>.facet.<parameter> 语法在每个字段的基础上指定以下所有参数。

facet.field

可选

默认值:无

facet.field 参数标识应视为分面的字段。它会迭代该字段中的每个词条,并使用该词条作为约束生成分面计数。此参数可以在查询中多次指定,以选择多个分面字段。

如果你未将此参数至少设置为架构中的一个字段,则本部分中描述的其他参数都不会产生任何效果。
facet.prefix

可选

默认值:无

facet.prefix 参数将要分面的词条限制为以给定字符串前缀开头的词条。这不会以任何方式限制查询,只会限制响应查询返回的分面。

facet.contains

可选

默认值:无

facet.contains 参数将分面限制为包含给定子字符串的术语。这不会以任何方式限制查询,只会限制对查询返回的分面。

facet.contains.ignoreCase

可选

默认值:无

如果使用了 facet.contains,则 facet.contains.ignoreCase 参数会在将给定子字符串与候选分面术语匹配时忽略大小写。

facet.matches

可选

默认值:无

如果你只想返回与正则表达式匹配的术语的分面存储段。

facet.sort

可选

默认值:无

此参数确定分面字段约束的顺序。

此参数有两个选项。

count

按计数对约束进行排序(最高计数优先)。

index

按索引顺序返回约束(按索引术语按字母顺序排列)。对于 ASCII 范围内的术语,这将按字母顺序排列。

如果 facet.limit 大于 0,则默认值为 count,否则,默认值为 index。请注意,当 使用特定术语限制分面 时,默认逻辑会发生更改。

facet.limit

可选

默认值:100

此参数指定应为分面字段返回的最大约束计数(本质上是返回的字段分面的数量)。负值表示 Solr 将返回无限数量的约束计数。

facet.offset

可选

默认值:0

facet.offset 参数表示约束列表中的偏移量,以允许分页。

facet.mincount

可选

默认值:0

facet.mincount 参数指定分面字段包含在响应中所需的最小计数。如果字段的计数低于最小值,则不会返回该字段的分面。

facet.missing

可选

默认值:false

如果设置为 true,则此参数表示,除了分面字段基于术语的约束之外,还应计算与查询匹配但没有该字段分面值的全部结果的计数,并在响应中返回该计数。

facet.method

可选

默认值:fc

facet.method 参数选择 Solr 在对字段进行分面时应使用的算法或方法类型。

以下方法可用。

enum

枚举字段中的所有术语,计算与查询匹配的文档与与术语匹配的文档的文档交集。

建议将此方法用于仅具有少数不同值的多个值字段的分面。每个文档的平均值数目无关紧要。

例如,对具有美国各州(如阿拉巴马州、阿拉斯加州、怀俄明州等)的字段进行分面将导致 50 个缓存过滤器,这些过滤器将被反复使用。filterCache 应足够大以容纳所有缓存过滤器。

fc

通过迭代与查询匹配的文档并对出现在每个文档中的术语求和来计算分面计数。

如果字段是多值的或已标记化(根据 FieldType.isTokened()),则当前使用 UnInvertedField 缓存来实现此功能。在缓存中查找每个文档以查看它包含哪些术语/值,并为每个值增加计数。

当字段的索引值数目很高,但每个文档的值数目较低时,此方法非常出色。对于多值字段,使用混合方法,该方法对与许多文档匹配的术语使用 filterCache 中的术语过滤器。字母 fc 代表字段缓存。

fcs

单值字符串字段的每段字段分面。使用 facet.method=fcs 启用并使用 threads 本地参数控制所用线程数。此参数允许在快速索引更改的情况下加快分面速度。

默认值为 fc(使用 BoolField 字段类型的字段和请求 facet.exists=true 时除外),因为它往往使用较少的内存,并且当字段在索引中具有许多唯一术语时速度更快。

facet.enum.cache.minDf

可选

默认值:0

此参数指示在确定该术语的约束计数时应使用 filterCache 的最小文档频率(与术语匹配的文档数)。这仅与分面的 facet.method=enum 方法一起使用。

大于零的值会减少 filterCache 的内存使用,但会增加处理查询所需的时间。如果您要对具有大量词条的字段进行分面,并且希望减少内存使用,请尝试将此参数设置为 2550 之间的值,并运行一些测试。然后,根据需要优化参数设置。

默认值为 0,导致 filterCache 用于字段中的所有词条。

facet.exists

可选

默认值:无

要将分面计数限制为 1,请指定 facet.exists=true。此参数可与 facet.method=enum 一起使用,或在省略时使用。它只能用于非 trie 字段(例如字符串)。它可能会加快对大型索引和/或高基数分面值的分面计数。

facet.excludeTerms

可选

默认值:无

如果您想从分面计数中删除词条,但将它们保留在索引中,则 facet.excludeTerms 参数允许您这样做。

facet.overrequest.countfacet.overrequest.ratio

可选

默认值:请参阅说明

在某些情况下,可以通过从每个单独的分片“过度请求”所需约束的数量(即 facet.limit)来提高在分布式 Solr 查询中为分面返回的“顶部”约束的选择准确性。在这些情况下,默认情况下会要求每个分片提供前 10 + (1.5 * facet.limit) 个约束。

根据文档在分片中的分区方式以及使用的 facet.limit 值,您可能会发现增加或减少 Solr 过度请求的数量是有利的。这可以通过设置 facet.overrequest.count(默认为 10)和 facet.overrequest.ratio(默认为 1.5)参数来实现。

facet.threads

可选

默认值:无

此参数将导致加载分面中使用的基础字段与指定线程数并行执行。指定为 facet.threads=N,其中 N 是使用的最大线程数。

省略此参数或将线程数指定为 0 将不会产生任何线程,并且只使用主请求线程。指定负数的线程将创建多达 Integer.MAX_VALUE 个线程。

范围分面

您可以在任何日期字段或支持范围查询的任何数字字段上使用范围分面。这对于将一系列范围查询(作为按查询分面)拼接在一起特别有用,例如价格。

facet.range

必需

默认值:无

facet.range 参数定义了 Solr 应为其创建范围分面的字段。例如

facet.range=price&facet.range=age
facet.range=lastModified_dt
facet.range.start

必需

默认值:无

facet.range.start 参数指定范围的下限。您可以使用 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

必需

默认值:无

facet.range.end 指定范围的上限。您可以使用 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

必需

默认值:无

每个范围的跨度,表示为要添加到下限的值。对于日期字段,这应使用 DateMathParser 语法(例如,facet.range.gap=%2B1DAY …​ '+1DAY')来表示。

您可以使用 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

可选

默认值:false

facet.range.hardend 参数是一个布尔参数,它指定了 Solr 在 facet.range.gapfacet.range.startfacet.range.end 之间无法均匀分配时应如何处理这种情况。

如果为 true,则最后一个范围约束将具有 facet.range.end 值作为上限。如果为 false,则最后一个范围将具有大于 facet.range.end 的最小可能上限,因此范围将是指定范围间距的确切宽度。

此参数可以使用语法 f.<fieldname>.facet.range.hardend 按每个字段指定。

facet.range.include

可选

默认值:请参阅说明

默认情况下,用于计算 facet.range.startfacet.range.end 之间范围分面的范围包含其下限,但不包含上限。使用 facet.range.other 参数定义的“before”范围是排他的,而“after”范围是包含的。此默认值等效于下面的“lower”,不会导致边界处的重复计数。您可以使用 facet.range.include 参数使用以下选项来修改此行为

  • lower:所有基于间距的范围都包含其下限。

  • upper:所有基于间距的范围都包含其上限。

  • edge:第一个和最后一个间距范围包含其边缘边界(第一个范围的下限,最后一个范围的上限),即使未指定相应的上限/下限选项也是如此。

  • outer:“before”和“after”范围将包含其边界,即使第一个或最后一个范围已经包含这些边界也是如此。

  • all:包含所有选项:lowerupperedgeouter

您可以使用 f.<fieldname>.facet.range.include 语法按每个字段指定此参数,并且可以多次指定以指示多个选择。

为确保避免重复计算,请勿同时选择lowerupper,请勿选择outer,请勿选择all
facet.range.other

可选

默认值:无

facet.range.other参数指定除了facet.range.startfacet.range.end之间的每个范围约束的计数之外,还应计算以下选项的计数

  • before:字段值低于第一个范围下限的所有记录。

  • after:字段值大于最后一个范围上限的所有记录。

  • between:字段值介于所有范围的开始和结束边界之间的所有记录。

  • none:不计算任何计数。

  • all:计算之前、之间和之后的计数。

此参数可以使用f.<fieldname>.facet.range.other语法逐字段指定。除了all选项之外,还可以多次指定此参数以指示多个选项,但none将覆盖所有其他选项。

facet.range.method

可选

默认值:filter

facet.range.method参数选择 Solr 应用于范围分面的算法或方法类型。两种方法都会产生相同的结果,但性能可能会有所不同。

filter

此方法基于其他 facet.range 参数生成范围,并针对每个范围执行筛选器,该筛选器稍后与主查询结果集相交以获取计数。它将利用 filterCache,因此它将受益于足够大的缓存来包含所有范围。

dv

此方法迭代与主查询匹配的文档,并针对每个文档找到值的正确范围。此方法将利用DocValues(如果已针对该字段启用)或 fieldCache。当使用group.facets时,不支持对字段类型 DateRangeField 使用dv方法。

日期范围和时区

日期字段上的范围分面是一种常见的情况,其中 TZ 参数可用于确保“每天的分面计数”或“每个月的分面计数”基于给定的天/月相对于特定时区的“开始”时间的有意义的定义。

有关更多信息,请参阅 日期格式化和日期数学 部分中的示例。

范围分面中的 facet.mincount

facet.mincount 参数与字段分面中使用的参数相同,也应用于范围分面。使用时,计数低于最小值的范围将不会包含在响应中。

枢轴(决策树)分面

枢轴是一种汇总工具,可让您自动对存储在表中的数据进行排序、计数、求和或求平均值。结果通常显示在显示汇总数据的第二个表中。枢轴分面可让您通过多个字段创建分面文档结果的汇总表。

另一种看待它的方式是,查询会生成一个决策树,因为 Solr 会告诉您“对于分面 A,约束/计数为 X/N、Y/M 等。如果您要通过 X 约束 A,那么 B 的约束计数将为 S/P、T/Q 等”。换句话说,它会提前告诉您,如果您从当前分面结果应用约束,字段的“下一”组分面结果将是什么。

facet.pivot

可选

默认值:无

facet.pivot 参数定义用于枢轴的字段。多个 facet.pivot 值将在响应中创建多个“facet_pivot”部分。用逗号分隔每个字段列表。

facet.pivot.mincount

可选

默认值:1

facet.pivot.mincount 参数定义了必须匹配的最小文档数,以便将分面包含在结果中。

使用“bin/solr -e techproducts”示例,如下所示的查询 URL 将返回以下数据,其中枢轴分面结果位于“facet_pivot”部分

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

将统计组件与枢轴结合使用

除了其他类型分面支持的一些 常规本地参数 外,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

结果

{"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 本地参数可与 facet.pivot 一起使用,以引用应为每个枢轴约束计算的 facet.query 实例(按标签)。类似地,range 本地参数可与 facet.pivot 一起使用,以引用 facet.range 实例。

在下面的示例中,为 facet.pivot 结果层次结构的 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 结果层次结构计算了两个范围分面

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
{"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 参数不同,但上面描述的许多分面参数也可以与枢轴分面一起使用

  • facet.limit

  • facet.offset

  • facet.sort

  • facet.overrequest.count

  • facet.overrequest.ratio

区间分面

另一种受支持的分面形式是区间分面。这听起来类似于范围分面,但其功能实际上更接近于使用范围查询执行分面查询。区间分面允许您设置可变区间,并统计指定字段中值位于这些区间内的文档数。

尽管可以使用带有范围查询的分面查询实现相同的功能,但这两种方法的实现非常不同,并且会根据上下文提供不同的性能。

如果您担心搜索的性能,则应该使用这两种选项进行测试。对于同一字段的多个区间,区间分面往往更好,而分面查询往往在过滤器缓存更有效(例如静态索引)的环境中更好。

如果为该字段启用了 文档值,则此方法将使用文档值,否则将使用字段缓存。

对区间分面使用这些参数

facet.interval

可选

默认值:无

此参数指示必须应用区间分面的字段。可以在同一请求中多次使用它来指示多个字段。

facet.interval=price&facet.interval=size

facet.interval.set

可选

默认值:无

此参数用于设置字段的区间,可以多次指定以指示多个区间。此参数是全局的,这意味着它将用于所有使用 facet.interval 指示的字段,除非有特定字段的覆盖。要在特定字段上覆盖此参数,可以使用:f.<fieldname>.facet.interval.set,例如

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

区间语法

区间必须以 '(' 或 '[' 开头,后跟起始值,然后是逗号 (','),结束值,最后是闭合的 ')' 或 ']’。

例如

  • (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

分面的本地参数

本地参数语法允许覆盖全局设置。它还可以提供一种向其他参数值添加元数据的方法,很像 XML 属性。

标记和排除过滤器

您可以标记特定过滤器并在分面时排除这些过滤器。在执行多选分面时,这很有用。

考虑以下带有分面的示例查询

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

由于所有内容都已受过滤器 doctype:pdf 约束,因此 facet.field=doctype 分面命令当前是多余的,并且除了 doctype:pdf 之外,将为所有内容返回 0 计数。

要为 doctype 实施多选分面,GUI 可能仍希望显示其他 doctype 值及其关联计数,就好像 doctype:pdf 约束尚未应用一样。例如

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

要返回当前未选中的 doctype 值的计数,请标记直接约束 doctype 的过滤器,并在对 doctype 进行分面时排除这些过滤器。

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

所有类型的分面都支持过滤器排除。tagex 本地参数都可以通过用逗号分隔多个值来指定多个值。

更改输出键

要更改分面命令的输出键,请使用 key 本地参数指定一个新名称。例如

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

上述参数设置会导致在响应中使用键“mylabel”而不是“doctype”返回“doctype”字段的字段分面结果。当使用不同的排除对同一字段进行多次分面时,这会很有用。

使用特定术语限制分面

要使用特定术语限制字段分面,请用逗号分隔指定它们,并使用 terms 本地参数。术语中的逗号和引号可以用反斜杠转义,如 \,。在这种情况下,分面的计算方式类似于 facet.method=enum,但会忽略 facet.enum.cache.minDf。例如

facet.field={!terms='alfa,betta,with\,with\',with space'}symbol

此本地参数会覆盖 facet.sort 的默认逻辑。如果省略 facet.sort,则分面将按给定的术语顺序返回,该顺序可能会因 indexcount 值而改变。注意:当提供此参数时,其他参数可能无法得到完全支持。

请参阅 空间搜索,了解按距离分面和通过分面生成热图的示例。

请参阅 json.nl,了解使用 JSON 响应编写器时控制字段分面数据写入格式的 json.nl 参数的详细信息。