统计组件

统计组件返回文档集中数字、字符串和日期字段的简单统计信息。

本节中的示例查询假定您正在运行 Solr 附带的“techproducts”示例

bin/solr start -e techproducts

统计组件参数

统计组件接受以下参数

stats

可选

默认值:false

如果为 true,则调用统计组件。

stats.field

必填

默认值:无

指定应为其生成统计信息的字段。此参数可以在查询中多次调用,以便请求多个字段的统计信息。

本地参数可用于指示应计算受支持的统计信息的子集,和/或应基于任意数值函数(或查询)的结果计算统计信息,而不是简单的字段名称。 请参见下面的示例。

统计组件示例

以下查询演示了如何针对两个不同的数值字段计算统计信息,以及如何使用 text 字段,对 termfreq() 函数调用的结果计算统计信息

https://127.0.0.1:8983/solr/techproducts/select?q=*:*&wt=xml&stats=true&stats.field={!func}termfreq('text','memory')&stats.field=price&stats.field=popularity&rows=0&indent=true
<lst name="stats">
  <lst name="stats_fields">
    <lst name="termfreq(text,memory)">
      <double name="min">0.0</double>
      <double name="max">3.0</double>
      <long name="count">32</long>
      <long name="missing">0</long>
      <double name="sum">10.0</double>
      <double name="sumOfSquares">22.0</double>
      <double name="mean">0.3125</double>
      <double name="stddev">0.7803018439949604</double>
      <lst name="facets"/>
    </lst>
    <lst name="price">
      <double name="min">0.0</double>
      <double name="max">2199.0</double>
      <long name="count">16</long>
      <long name="missing">16</long>
      <double name="sum">5251.270030975342</double>
      <double name="sumOfSquares">6038619.175900028</double>
      <double name="mean">328.20437693595886</double>
      <double name="stddev">536.3536996709846</double>
      <lst name="facets"/>
    </lst>
    <lst name="popularity">
      <double name="min">0.0</double>
      <double name="max">10.0</double>
      <long name="count">15</long>
      <long name="missing">17</long>
      <double name="sum">85.0</double>
      <double name="sumOfSquares">603.0</double>
      <double name="mean">5.666666666666667</double>
      <double name="stddev">2.943920288775949</double>
      <lst name="facets"/>
    </lst>
  </lst>
</lst>

支持的统计信息

下表解释了统计组件支持的统计信息。并非所有字段类型都支持所有统计信息,并且并非默认计算所有统计信息(有关详细信息,请参见下面的 具有统计组件的本地参数

min

集合中所有文档中字段/函数的最小值。为所有字段类型计算此统计信息,并且默认情况下计算此统计信息。

max

集合中所有文档中字段/函数的最大值。为所有字段类型计算此统计信息,并且默认情况下计算此统计信息。

sum

集合中所有文档中字段/函数的所有值之和。为数值和日期字段类型计算此统计信息,并且默认情况下计算此统计信息。

count

此字段/函数在集合中所有文档中找到的值的数量。为所有字段类型计算此统计信息,并且默认情况下计算此统计信息。

missing

数据集中此字段/函数没有值的文档数量。此统计信息针对所有字段类型计算,默认情况下计算。

平方和

所有值的平方和(计算标准差的副产品)。此统计信息针对数值和日期字段类型计算,默认情况下计算。

平均值

平均值 (v1 + v2 …​. + vN)/N。此统计信息针对数值和日期字段类型计算,默认情况下计算。

标准差

标准差,衡量数据集中值的分布范围。此统计信息针对数值和日期字段类型计算,默认情况下计算。

百分位数

基于参数值指定的截止点的百分位数列表,例如 1,99,99.9。这些值是近似值,使用 t-digest 算法。此统计信息针对数值字段类型计算,默认情况下不计算。

不同值

数据集中所有文档中字段/函数的所有不同值的集合。对于基数不小的字段,此计算可能非常耗时。此统计信息针对所有字段类型计算,但默认情况下不计算。

不同计数

数据集中所有文档中字段/函数中不同值的确切数量。对于基数不小的字段,此计算可能非常耗时。此统计信息针对所有字段类型计算,但默认情况下不计算。

基数

对数据集中所有文档中字段/函数中不同值的数量进行统计近似(目前使用 HyperLogLog 算法)。此计算比使用 countDistinct 选项效率高得多,但可能不是 100% 准确。

此选项的输入可以是介于 0.01.0 之间的浮点数,表示算法应尝试精确的程度:0.0 表示尽可能少地使用内存;1.0 表示尽可能多地使用内存以尽可能准确。true 被支持为 0.3 的别名。

此统计信息针对所有字段类型计算,但默认情况下不计算。

统计组件的局部参数

分面组件 类似,stats.field 参数支持以下局部参数:

  • 标记和排除过滤器:stats.field={!ex=filterA}price

  • 更改输出键:stats.field={!key=my_price_stats}price

  • 标记统计信息以facet.pivot一起使用stats.field={!tag=my_pivot_stats}price

局部参数还可以用于按名称指定单独的统计信息,从而覆盖默认计算的统计信息集,例如,stats.field={!min=true max=true percentiles='99,99.9,99.99'}price

如果通过局部参数指定了任何受支持的统计信息,则整个默认统计信息集将被覆盖,并且仅计算请求的统计信息。

在某些情况下,支持额外的“专家”局部参数以影响某些统计信息的行为

  • 百分位数

    • tdigestCompression - 一个正数值,默认为 100.0,控制 T-Digest 的压缩因子。值越大意味着精度越高,但也使用更多内存。

  • 基数

    • hllPreHashed - 一个布尔选项,指示统计信息正在对已在索引时哈希的“长”字段进行计算,从而允许 HLL 计算跳过此步骤。

    • hllLog2m - 一个整数值,指定要使用的显式“log2m”值,覆盖由基数局部参数和字段类型确定的启发式值 – 有关更多详细信息,请参阅 java-hll 文档

    • hllRegwidth - 一个整数值,指定要使用的显式“regwidth”值,覆盖由基数局部参数和字段类型确定的启发式值 – 有关更多详细信息,请参阅 java-hll 文档

局部参数示例

在这里,我们计算 price 字段的一些统计信息。针对所有库存产品(q=:fq=inStock:true)计算最小、最大、平均、第 90 和第 99 个百分位价格值,并且独立地针对所有产品(无论是否库存)计算所有默认统计信息(通过排除该过滤器)。

https://127.0.0.1:8983/solr/techproducts/select?q=*:*&fq={!tag=stock_check}inStock:true&stats=true&stats.field={!ex=stock_check+key=instock_prices+min=true+max=true+mean=true+percentiles='90,99'}price&stats.field={!key=all_prices}price&rows=0&indent=true&wt=xml
<lst name="stats">
  <lst name="stats_fields">
    <lst name="instock_prices">
      <double name="min">0.0</double>
      <double name="max">2199.0</double>
      <double name="mean">328.20437693595886</double>
      <lst name="percentiles">
        <double name="90.0">564.9700012207031</double>
        <double name="99.0">1966.6484985351556</double>
      </lst>
    </lst>
    <lst name="all_prices">
      <double name="min">0.0</double>
      <double name="max">2199.0</double>
      <long name="count">12</long>
      <long name="missing">5</long>
      <double name="sum">4089.880027770996</double>
      <double name="sumOfSquares">5385249.921747174</double>
      <double name="mean">340.823335647583</double>
      <double name="stddev">602.3683083752779</double>
    </lst>
  </lst>
</lst>

统计组件和分面

在使用 Pivot 分面时,可以使用 tag 引用 stats.field 参数集,以便在透视约束树的每个级别(即字段)计算多个统计信息。

有关更多信息和详细示例,请参阅 将统计组件与透视结合使用