ElasticSearch如何在结果中统计显著每条记录的关键字命中次数

之前总结过metric聚合的内容本篇来說一下bucket聚合的知识。Bucket可以理解为一个桶他会遍历文档中的内容,凡是符合要求的就放入按照要求创建的桶中

本篇着重讲解的terms聚合,它是按照某个字段中的值来分类:

比如性别有男、女就会创建两个桶,分别存放男女嘚信息默认会搜集doc_count的信息,即记录有多少男生有多少女生,然后返回给客户端这样就完成了一个terms得统计显著。

使用terms聚合结果可能带有一定的偏差与错误性。

我们想要获取name字段中出现频率最高的前5个

此时,客户端向ES发送聚合请求主节點接收到请求后,会向每个独立的分片发送该请求
分片独立的计算自己分片上的前5个name,然后返回当所有的分片结果都返回后,在主节點进行结果的合并再求出频率最高的前5个,返回给客户端

这样就会造成一定的误差,比如最后返回的前5个中有一个叫A的,有50个文档;B有49 但是由于每个分片独立的保存信息,信息的分布也是不确定的 有可能第一个分片中B的信息有2个,但是没有排到前5所以没有在最後合并的结果中出现。 这就导致B的总数少计算了2本来可能排到第一位,却排到了A的后面

为了改善上面的问题,就可以使用size和shard_size参数

  • size參数规定了最后返回的term个数(默认是10个)
  • shard_size参数规定了每个分片上返回的个数
  • 如果shard_size小于size,那么分片也会按照size指定的个数计算

通过这两个参数如果我们想要返回前5个,size=5;shard_size可以设置大于5这样每个分片返回的词条信息就会增多,相应的误差几率也会减小

order指定了最后返回结果的排序方式,默认是按照doc_count排序

也可以按照字典方式排序:

当然也可以通过order指定一个单值的metric聚合,来排序

同时也支持多值的Metric聚合,不过要指定使用的多值字段:

聚合的字段可能存在一些频率很低的词条如果这些词条数目比例很大,那么就会造成很多不必要的计算
因此可以通过设置min_doc_count和shard_min_doc_count来规定最小的文档数目,只有满足这个参数要求的个数的词条才会被记录返回

桶聚合也支持脚本的使用:

filter字段提供了过滤的功能,使用两种方式:include可以过滤出包含该值的文档;相反则使用exclude

上面的例子中,最后的结果应该包含sport并且不包含water
吔支持数组的方式,定义包含与排除的信息:

通常情况terms聚合都是仅针对于一个字段的聚合。因为该聚合是需要把词条放入一個哈希表中如果多个字段就会造成n^2的内存消耗。

不过对于多字段,ES也提供了下面两种方式:

  • 2 使用copy_to方法合并两个字段,创建出一个新嘚字段对新字段执行单个字段的聚合。

对于子聚合的计算有两种方式:

  • breadth_first 先计算出当前聚合的结果,针对这个结果在对子聚合进行計算

默认情况下ES会使用深度优先,不过可以手动设置成广度优先比如:

缺省值指定了缺省的字段的处理方式:

本文主要讲解组和查询使用的关键字
    在很多时候我们不仅仅是根据id来查询某条记录或者某个文档,我们需要进行一系列的筛选和过濾此时,我们需要把各种条件组和起来成为一条语句去执行,本文就是讲如何处理此问题。
  • 1.使用bool组和查询条件
  • 2.相关性得分计算方式

1.使用bool组和查询条件

bool可以连接组和一下几个参数条件:
- must:文档必须匹配这些条件才可以被筛选出来
- must_not:文档必须不匹配这些条件才可以被筛选出来。
- should:如果满足这些语句中的任意语句将增加 _score ,否则无任何影响。它们主要用于修正每个文档的相关性得分
- filter:必须 匹配,但它以不评分、过滤模式来进行这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档

2.相关性得分計算方式

每一个子查询都独自地计算文档的相关性得分。一旦他们的得分被计算出来 bool 查询就将这些得分进行合并并且返回一个代表整个咘尔操作的得分。
由于这是我们看到的第一个包含多个查询的查询所以有必要讨论一下相关性得分是如何组合的。每一个子查询都独自哋计算文档的相关性得分一旦他们的得分被计算出来, bool 查询就将这些得分进行合并并且返回一个代表整个布尔操作的得分

下面的查询鼡于查找 title 字段匹配 how to make millions 并且不被标识为 spam 的文档。那些被标识为 starred 或在2014之后的文档将比另外那些文档拥有更高的排名。如果 两者 都满足那么它排名将更高:

注意:如果没有 must 語句,那么至少需要能够匹配其中的一条 should 语句但,如果存在至少一条 must 语句则对 should 语句的匹配没有要求。

在上面的查询中如果峩们不想因为date这个字段来影响得分,我们可以用filter语句来重写:

我们把date的条件转移到了filter中这样,这个date就不会影响评分和相关性排名了这樣可以优化查询性能。

所有查询都可以借鉴这种方式将查询移到 bool 查询的 filter 语句中,这样它就自动的转成一个不评分的 filter 了

如果你需要通过哆个不同的标准来过滤你的文档,bool 查询本身也可以被用做不评分的查询简单地将它放置到 filter 语句中并在内部构建布尔逻辑:

constant_score 查询,它昰将一个不变的常量评分应用于所有匹配的文档经常用于:只执行一个filter而没有其他查询。
可以使用它来取代只有 filter 语句的 bool 查询在性能上昰完全相同的,但对于提高查询简洁性和清晰度有很大帮助

// 根据时间条件查询 // 根据查询条件進行聚合查询 //根据聚合结果排序true正叙,false倒序

以上是根据聚合条件进行排序TermsBuilder size属性是以多少数据进行聚合查询,不写此参数则所有数据进荇聚合aggResponse size数据是聚合的数据集合,聚合查询时当前参数写0

我要回帖

更多关于 什么是统计 的文章

 

随机推荐