本地英文版地址: ../en/search-aggregations-bucket-rare-terms-aggregation.html
一个多桶聚合,基于值源,用于查找“稀有”的词项,即位于分布长尾且不常用的词项。
从概念上讲,这类似于按_count
升序排序的terms
聚合。
正如terms聚合文档中所指出的,实际上按计数升序对terms
聚合进行排序会产生极大的误差。
相反,应该使用rare_terms
聚合。
孤立地看,rare_terms
聚合如下所示:
{ "rare_terms": { "field": "the_field", "max_doc_count": 1 } }
表 6. rare_terms
参数
参数名称 |
描述 |
是否必须 |
默认值 |
|
希望搜索稀有词项的字段 |
必须的 |
|
|
一个词项应该出现在文档中的最大数量。 |
可选 |
|
|
内部布谷鸟顾虑器(CuckooFilters)的精度。精度越小,近似值越精确,但内存使用率越高。 但是不能小于 |
可选 |
|
|
应包含在聚合中的词项 |
可选 |
|
|
应从聚合中排除的词项 |
可选 |
|
|
如果文档中没有正在聚合的字段,则应使用的值 |
可选 |
示例:
GET /_search { "aggs" : { "genres" : { "rare_terms" : { "field" : "genre" } } } }
响应:
{ ... "aggregations" : { "genres" : { "buckets" : [ { "key" : "swing", "doc_count" : 1 } ] } } }
在这个例子中,我们看到的唯一的桶是“swing”桶,因为它是唯一出现在一个文档中的词项。
如果我们将max_doc_count
增加到2
,我们将看到更多的桶:
GET /_search { "aggs" : { "genres" : { "rare_terms" : { "field" : "genre", "max_doc_count": 2 } } } }
现在显示了“jazz”词项,其doc_count
为2:
{ ... "aggregations" : { "genres" : { "buckets" : [ { "key" : "swing", "doc_count" : 1 }, { "key" : "jazz", "doc_count" : 2 } ] } } }
参数max_doc_count
用于控制一个词项可以拥有的文档数量的上限。
像terms
聚合一样,rare_terms
聚合没有大小限制。
这意味着将返回符合max_doc_count
标准的词项。
聚合以这种方式运行,以避免困扰terms
聚合的升序问题。
然而,这确实意味着如果选择不正确,可能会返回大量结果。
为了限制这种设置的危险性,max_doc_count
的最大值是100
。
由于其工作方式的原因,rare_terms 聚合比其他聚合更容易超出search.max_buckets
软限制。
当聚合收集结果时,max_bucket
软限制基于每个分片进行评估。
一个词项在一个分片上可能是“稀有的”,但是一旦所有分片结果合并在一起,它就变得“不稀有”了。
这意味着单个分片倾向于收集比真正罕见的更多的桶,因为它们只有自己的本地视图。
这个列表最终在协调节点上被删减为正确的、更小的稀有词项列表……但是一个分片可能已经触发了max_buckets
软限制并中止了请求。
当对可能包含许多“罕见”术语的字段进行聚合时,你可能需要增加max_buckets
软限制的值。
或者,你可能需要找到一种方法来过滤结果,以返回更少的稀有值(更小的时间跨度、按类别过滤等),或者重新评估你对“稀有”的定义(例如,如果某个东西出现100,000次,它真的“稀有”吗?)
确定数据集中“罕见的”词项的简单方法是将所有值放在一个映射中,随着每个文档被访问,计数递增,然后返回底部的n
行。
这甚至不能扩展到中等大小的数据集。
一种仅保留来自每个分片的“前n”个值(也称为terms
聚合)的分片方法会失败,因为问题的长尾特性意味着,如果不简单地收集来自所有分片的所有值,就不可能找到“前n”个底部的值。
相反,rare_terms聚合使用不同的近似算法:
- 第一次看到值时,它们会被放置在一个映射中。
- 该词项每增加一次,映射中的计数器就加一
-
如果计数器大于
max_doc_count
阈值,则从映射中移除该词项,并将其放入布谷鸟过滤器(CuckooFilter)中 - 每个词项都要参考布谷鸟过滤器(CuckooFilter)。 如果该值在过滤器内,则已知它已经高于阈值并被跳过。
执行后,值的映射是max_doc_count
阈值下的“稀有”词项的映射。
然后这个映射和布谷鸟过滤器与所有其他分片合并。
如果有大于阈值的此昂(或出现在不同分片的布谷鸟过滤器中),该词项将从合并列表中删除。
最终的值映射作为“稀有”词项返回给用户。
布谷鸟过滤器有可能返回误报(它们可以说某个值存在于它们的集合中,而实际上它并不存在)。 由于布谷鸟过滤器用于查看某项是否超过阈值,这意味着布谷鸟过滤器的误报将错误地认为某个值是常见的,而实际上它并不是常见的(从而将其从桶的最终列表中排除)。 实际上,这意味着聚合表现出假阴性行为,因为过滤器的使用与人们通常认为的近似集合成员草图的方式“相反”。
布谷鸟过滤器在论文中有更详细的描述:
Fan, Bin, et al. "Cuckoo filter: Practically better than bloom." 第10届ACM国际新兴网络实验和技术会议录。美国计算机学会,2014年。
虽然内部的布谷鸟过滤器本质上是近似的,但假阴性率可以通过参数precision
来控制。
这允许用户用更多的运行时内存来换取更精确的结果。
默认精度是0.001
,最小精度值是(例如,最精确和最大的内存开销)是0.00001
。
下面是一些图表,展示了不同词项的精确度和数量如何影响聚合的准确性。
X轴显示聚合看到的唯一值的数量,Y轴显示误差百分比。
每条折线代表一个“稀有”条件(从一个稀有物品到100,000个稀有物品)。
例如,橙色的“10”线条表示100万 ~ 2000万个唯一值中有10个值是“罕见的”(doc_count == 1
),其余值的doc_count > 1
第一张图显示的是精度为0.01
的情况:
以及精度0.001
(默认)的情况:
最后一个是精度为0.0001
的情况:
默认精度为0.001
,在测试条件下保持 < 2.5%的精度,随着唯一值数量的增加,精度以受控的线性方式缓慢下降。
默认精度为0.001
,内存配置为1.748⁻⁶ * n
字节,其中n
是聚合看到的唯一值的数量(也可以粗略估计,例如2000万个唯一值大约是30MB内存)。
无论选择哪种精度,内存使用量都与唯一值的数量成线性关系,精度仅影响内存配置的斜率,如下图所示:
相比之下,2000万个桶的等效 terms 聚合大约为 20m * 69b == ~1.38gb
(69字节是对空桶成本的非常乐观的估计,远远低于熔断器所占的成本)。
因此,尽管rare_terms
聚合成本相对较高,但其数量级仍然小于等价的 terms 聚合
可以过滤将用于创建桶的值。
这可以使用基于正则表达式字符串或精确值数组的include
和exclude
参数来完成。
此外,include
子句可以使用partition
表达式进行过滤。
GET /_search { "aggs" : { "genres" : { "rare_terms" : { "field" : "genre", "include" : "swi*", "exclude" : "electro*" } } } }
在上面的例子中,将为所有以swi
开头的标签创建桶,除了那些以 electro
开头的标签(因此标签swing
将被聚合,而不是electro_swing
)。
include
正则表达式将确定“允许”聚合哪些值,而exclude
将确定不应该聚合的值。
当两者都被定义时,exclude
优先,这意味着首先计算include
,然后才计算exclude
。
语法与正则查询相同。
参数missing
定义应该如何处理有缺失值的文档。 默认情况下,它们将被忽略,但也可以将它们视为有一个值。
rear_terms 聚合必须以breadth_first
(广度优先)模式运行,因为它需要在文档计数阈值被突破时修剪词项。
这个要求意味着 rear_terms 聚合与需要 depth_first
(深度优先) 的某些聚合组合不兼容。
特别是,对nested
(嵌套)子聚合进行评分会强制整个聚合树以depth_first
(深度优先) 模式运行。
因为 rear_terms 聚合和无法处理depth_first
(深度优先),就会抛出一个异常。
一个具体的例子,如果rare_terms
聚合是nested
聚合的子聚合,并且rare_terms
的一个子聚合需要文档评分(比如top_hits
聚合),就会抛出一个异常。
- Elasticsearch权威指南: 其他版本:
- Elasticsearch是什么?
- 7.7版本的新特性
- 开始使用Elasticsearch
- 安装和设置
- 升级Elasticsearch
- 搜索你的数据
- 查询领域特定语言(Query DSL)
- SQL access(暂时不翻译)
- Overview
- Getting Started with SQL
- Conventions and Terminology
- Security
- SQL REST API
- SQL Translate API
- SQL CLI
- SQL JDBC
- SQL ODBC
- SQL Client Applications
- SQL Language
- Functions and Operators
- Comparison Operators
- Logical Operators
- Math Operators
- Cast Operators
- LIKE and RLIKE Operators
- Aggregate Functions
- Grouping Functions
- Date/Time and Interval Functions and Operators
- Full-Text Search Functions
- Mathematical Functions
- String Functions
- Type Conversion Functions
- Geo Functions
- Conditional Functions And Expressions
- System Functions
- Reserved keywords
- SQL Limitations
- 聚合
- 度量(metric)聚合
- 桶(bucket)聚合
- adjacency_matrix 聚合
- auto_date_histogram 聚合
- children 聚合
- composite 聚合
- date_histogram 聚合
- date_range 聚合
- diversified_sampler 聚合
- filter 聚合
- filters 聚合
- geo_distance 聚合
- geohash_grid 聚合
- geotile_grid 聚合
- global 聚合
- histogram 聚合
- ip_range 聚合
- missing 聚合
- nested 聚合
- parent 聚合
- range 聚合
- rare_terms 聚合
- reverse_nested 聚合
- sampler 聚合
- significant_terms 聚合
- significant_text 聚合
- terms 聚合
- 给范围字段分桶的微妙之处
- 管道(pipeline)聚合
- 矩阵(matrix)聚合
- 重度缓存的聚合
- 只返回聚合的结果
- 聚合元数据
- Returning the type of the aggregation
- 使用转换对聚合结果进行索引
- 脚本
- 映射
- 删除的映射类型
- 字段数据类型
- alias(别名)
- array(数组)
- binary(二进制)
- boolean(布尔)
- date(日期)
- date_nanos(日期纳秒)
- dense_vector(密集矢量)
- histogram(直方图)
- flattened(扁平)
- geo_point(地理坐标点)
- geo_shape(地理形状)
- IP
- join(联结)
- keyword(关键词)
- nested(嵌套)
- numeric(数值)
- object(对象)
- percolator(渗透器)
- range(范围)
- rank_feature(特征排名)
- rank_features(特征排名)
- search_as_you_type(输入即搜索)
- Sparse vector
- Text
- Token count
- Shape
- Constant keyword
- Meta-Fields
- Mapping parameters
- Dynamic Mapping
- Text analysis
- Overview
- Concepts
- Configure text analysis
- Built-in analyzer reference
- Tokenizer reference
- Char Group Tokenizer
- Classic Tokenizer
- Edge n-gram tokenizer
- Keyword Tokenizer
- Letter Tokenizer
- Lowercase Tokenizer
- N-gram tokenizer
- Path Hierarchy Tokenizer
- Path Hierarchy Tokenizer Examples
- Pattern Tokenizer
- Simple Pattern Tokenizer
- Simple Pattern Split Tokenizer
- Standard Tokenizer
- Thai Tokenizer
- UAX URL Email Tokenizer
- Whitespace Tokenizer
- Token filter reference
- Apostrophe
- ASCII folding
- CJK bigram
- CJK width
- Classic
- Common grams
- Conditional
- Decimal digit
- Delimited payload
- Dictionary decompounder
- Edge n-gram
- Elision
- Fingerprint
- Flatten graph
- Hunspell
- Hyphenation decompounder
- Keep types
- Keep words
- Keyword marker
- Keyword repeat
- KStem
- Length
- Limit token count
- Lowercase
- MinHash
- Multiplexer
- N-gram
- Normalization
- Pattern capture
- Pattern replace
- Phonetic
- Porter stem
- Predicate script
- Remove duplicates
- Reverse
- Shingle
- Snowball
- Stemmer
- Stemmer override
- Stop
- Synonym
- Synonym graph
- Trim
- Truncate
- Unique
- Uppercase
- Word delimiter
- Word delimiter graph
- Character filters reference
- Normalizers
- Index modules
- Ingest node
- Pipeline Definition
- Accessing Data in Pipelines
- Conditional Execution in Pipelines
- Handling Failures in Pipelines
- Enrich your data
- Processors
- Append Processor
- Bytes Processor
- Circle Processor
- Convert Processor
- CSV Processor
- Date Processor
- Date Index Name Processor
- Dissect Processor
- Dot Expander Processor
- Drop Processor
- Enrich Processor
- Fail Processor
- Foreach Processor
- GeoIP Processor
- Grok Processor
- Gsub Processor
- HTML Strip Processor
- Inference Processor
- Join Processor
- JSON Processor
- KV Processor
- Lowercase Processor
- Pipeline Processor
- Remove Processor
- Rename Processor
- Script Processor
- Set Processor
- Set Security User Processor
- Split Processor
- Sort Processor
- Trim Processor
- Uppercase Processor
- URL Decode Processor
- User Agent processor
- ILM: Manage the index lifecycle
- Monitor a cluster
- Frozen indices
- Roll up or transform your data
- Set up a cluster for high availability
- Snapshot and restore
- Secure a cluster
- Overview
- Configuring security
- User authentication
- Built-in users
- Internal users
- Token-based authentication services
- Realms
- Realm chains
- Active Directory user authentication
- File-based user authentication
- LDAP user authentication
- Native user authentication
- OpenID Connect authentication
- PKI user authentication
- SAML authentication
- Kerberos authentication
- Integrating with other authentication systems
- Enabling anonymous access
- Controlling the user cache
- Configuring SAML single-sign-on on the Elastic Stack
- Configuring single sign-on to the Elastic Stack using OpenID Connect
- User authorization
- Built-in roles
- Defining roles
- Security privileges
- Document level security
- Field level security
- Granting privileges for indices and aliases
- Mapping users and groups to roles
- Setting up field and document level security
- Submitting requests on behalf of other users
- Configuring authorization delegation
- Customizing roles and authorization
- Enabling audit logging
- Encrypting communications
- Restricting connections with IP filtering
- Cross cluster search, clients, and integrations
- Tutorial: Getting started with security
- Tutorial: Encrypting communications
- Troubleshooting
- Some settings are not returned via the nodes settings API
- Authorization exceptions
- Users command fails due to extra arguments
- Users are frequently locked out of Active Directory
- Certificate verification fails for curl on Mac
- SSLHandshakeException causes connections to fail
- Common SSL/TLS exceptions
- Common Kerberos exceptions
- Common SAML issues
- Internal Server Error in Kibana
- Setup-passwords command fails due to connection failure
- Failures due to relocation of the configuration files
- Limitations
- Alerting on cluster and index events
- Command line tools
- How To
- Glossary of terms
- REST APIs
- API conventions
- cat APIs
- cat aliases
- cat allocation
- cat anomaly detectors
- cat count
- cat data frame analytics
- cat datafeeds
- cat fielddata
- cat health
- cat indices
- cat master
- cat nodeattrs
- cat nodes
- cat pending tasks
- cat plugins
- cat recovery
- cat repositories
- cat shards
- cat segments
- cat snapshots
- cat task management
- cat templates
- cat thread pool
- cat trained model
- cat transforms
- Cluster APIs
- Cluster allocation explain
- Cluster get settings
- Cluster health
- Cluster reroute
- Cluster state
- Cluster stats
- Cluster update settings
- Nodes feature usage
- Nodes hot threads
- Nodes info
- Nodes reload secure settings
- Nodes stats
- Pending cluster tasks
- Remote cluster info
- Task management
- Voting configuration exclusions
- Cross-cluster replication APIs
- Document APIs
- Enrich APIs
- Explore API
- Index APIs
- Add index alias
- Analyze
- Clear cache
- Clone index
- Close index
- Create index
- Delete index
- Delete index alias
- Delete index template
- Flush
- Force merge
- Freeze index
- Get field mapping
- Get index
- Get index alias
- Get index settings
- Get index template
- Get mapping
- Index alias exists
- Index exists
- Index recovery
- Index segments
- Index shard stores
- Index stats
- Index template exists
- Open index
- Put index template
- Put mapping
- Refresh
- Rollover index
- Shrink index
- Split index
- Synced flush
- Type exists
- Unfreeze index
- Update index alias
- Update index settings
- Index lifecycle management API
- Ingest APIs
- Info API
- Licensing APIs
- Machine learning anomaly detection APIs
- Add events to calendar
- Add jobs to calendar
- Close jobs
- Create jobs
- Create calendar
- Create datafeeds
- Create filter
- Delete calendar
- Delete datafeeds
- Delete events from calendar
- Delete filter
- Delete forecast
- Delete jobs
- Delete jobs from calendar
- Delete model snapshots
- Delete expired data
- Estimate model memory
- Find file structure
- Flush jobs
- Forecast jobs
- Get buckets
- Get calendars
- Get categories
- Get datafeeds
- Get datafeed statistics
- Get influencers
- Get jobs
- Get job statistics
- Get machine learning info
- Get model snapshots
- Get overall buckets
- Get scheduled events
- Get filters
- Get records
- Open jobs
- Post data to jobs
- Preview datafeeds
- Revert model snapshots
- Set upgrade mode
- Start datafeeds
- Stop datafeeds
- Update datafeeds
- Update filter
- Update jobs
- Update model snapshots
- Machine learning data frame analytics APIs
- Create data frame analytics jobs
- Create inference trained model
- Delete data frame analytics jobs
- Delete inference trained model
- Evaluate data frame analytics
- Explain data frame analytics API
- Get data frame analytics jobs
- Get data frame analytics jobs stats
- Get inference trained model
- Get inference trained model stats
- Start data frame analytics jobs
- Stop data frame analytics jobs
- Migration APIs
- Reload search analyzers
- Rollup APIs
- Search APIs
- Security APIs
- Authenticate
- Change passwords
- Clear cache
- Clear roles cache
- Create API keys
- Create or update application privileges
- Create or update role mappings
- Create or update roles
- Create or update users
- Delegate PKI authentication
- Delete application privileges
- Delete role mappings
- Delete roles
- Delete users
- Disable users
- Enable users
- Get API key information
- Get application privileges
- Get builtin privileges
- Get role mappings
- Get roles
- Get token
- Get users
- Has privileges
- Invalidate API key
- Invalidate token
- OpenID Connect Prepare Authentication API
- OpenID Connect authenticate API
- OpenID Connect logout API
- SAML prepare authentication API
- SAML authenticate API
- SAML logout API
- SAML invalidate API
- SSL certificate
- Snapshot and restore APIs
- Snapshot lifecycle management API
- Transform APIs
- Usage API
- Watcher APIs
- Definitions
- Breaking changes
- Release notes
- Elasticsearch version 7.7.1
- Elasticsearch version 7.7.0
- Elasticsearch version 7.6.2
- Elasticsearch version 7.6.1
- Elasticsearch version 7.6.0
- Elasticsearch version 7.5.2
- Elasticsearch version 7.5.1
- Elasticsearch version 7.5.0
- Elasticsearch version 7.4.2
- Elasticsearch version 7.4.1
- Elasticsearch version 7.4.0
- Elasticsearch version 7.3.2
- Elasticsearch version 7.3.1
- Elasticsearch version 7.3.0
- Elasticsearch version 7.2.1
- Elasticsearch version 7.2.0
- Elasticsearch version 7.1.1
- Elasticsearch version 7.1.0
- Elasticsearch version 7.0.0
- Elasticsearch version 7.0.0-rc2
- Elasticsearch version 7.0.0-rc1
- Elasticsearch version 7.0.0-beta1
- Elasticsearch version 7.0.0-alpha2
- Elasticsearch version 7.0.0-alpha1