统计组件

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

本部分中的示例查询假定您正在运行 Solr 随附的“techproducts”示例

bin/solr -e techproducts

Stats 组件参数

Stats 组件接受以下参数

stats

可选

默认值:false

如果为 true,则调用 Stats 组件。

stats.field

必需

默认值:无

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

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

Stats 组件示例

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

http://localhost: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>

受支持的统计信息

下表说明了 Stats 组件支持的统计信息。并非所有统计信息都受所有字段类型支持,也并非所有统计信息都默认计算(有关详细信息,请参见下面的 Stats 组件的局部参数

min

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

max

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

sum

集合中所有文档中字段/函数的所有值的总和。此统计信息针对数字和日期字段类型计算,并且默认计算。

count

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

missing

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

sumOfSquares

所有值平方和(计算 stddev 的副产品)。此统计信息针对数字和日期字段类型计算,并且默认计算。

mean

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

stddev

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

percentiles

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

distinctValues

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

countDistinct

集合中所有文档中字段/函数中不同值的准确数量。对于基数不小的字段,此计算可能非常昂贵。此统计信息针对所有字段类型计算,但默认不计算。

cardinality

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

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

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

使用 Stats 组件的本地参数

类似于 Facet 组件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

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

在某些情况下,还支持其他“专家”本地参数,以影响某些统计信息的执行

  • percentiles

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

  • cardinality

    • hllPreHashed - 一个布尔选项,表示统计信息是在索引时已散列的“长”字段上计算的,从而允许 HLL 计算跳过此步骤。

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

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

使用局部参数的示例

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

http://localhost: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>

统计组件和分面

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

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