标签: elasticsearch-aggregation

ElasticSearch - 如何在聚合查询中显示其他字段名称

如何在输出存储桶中添加名为"agency_name"的新密钥.

我正在运行聚合代码,如下所示

{
  "aggs": {
    "name": {
      "terms": {
        "field": "agency_code"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我将得出结论

"aggregations": {
    "name": {
        "doc_count_error_upper_bound": 130,
        "sum_other_doc_count": 39921,
        "buckets": [
            {
                "key": "1000",
                "doc_count": 105163
            },
            {
                "key": "2100",
                "doc_count": 43006
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

在显示时我需要显示代理商名称,代码和doc_count

如何修改聚合查询以便我可以获得以下格式.我是ElasticSearch的新手,不知道如何解决这个问题

"aggregations": {
    "name": {
        "doc_count_error_upper_bound": 130,
        "sum_other_doc_count": 39921,
        "buckets": [
            {
                "key": "1000",
                "doc_count": 105163,
                "agency_name": 'Agent 1'
            },
            {
                "key": "2100",
                "doc_count": 43006,
                "agency_name": 'Agent 2'
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

ElasticSearch中的示例数据(分析字段)

{

    "_index": "feeds",
    "_type": "news", …
Run Code Online (Sandbox Code Playgroud)

elasticsearch elasticsearch-aggregation

21
推荐指数
2
解决办法
7324
查看次数

Elasticsearch搜索的结果多种多样

我使用流行度完成了一个复杂的查询,以使用Elasticsearch改进社交媒体文档的结果.查询工作得非常好,最重要的结果始终集中在查询和有趣的元素上.

但是它有一个问题,对于某些查询,第一个结果都来自同一个用户.

如果在更高的文档上检索到相同的用户,我想缩减文档.这样我希望结果更加多样化.

请注意,我不希望它们被删除,因为在某些情况下,查找同一用户的更多文档可能仍然很有趣,但我希望它们处于较低的位置.

任何人都可以建议一种方法来使它工作吗?


正如一些评论中所建议的,我更新了我的查询(简化版):

query = {"function_score": {
  "functions": [
    {"gauss": {"createdAt":
        {"origin": "now", "scale": "30d", "offset": "7d", "decay" :0.9 } 
    }},
    {"gauss": {"shares.last.twitter_retweets_log":
        {"origin": 4.52, "scale": 2.61, "decay" : 0.9} 
    }},
  ],
  "query": {"bool":{"must":[
    {"exists":{"field": "images"}},
    {"multi_match":{"query": "foo boo", fields:["text", "link.title"]}}
  ]}},
  "score_mode": "multiply"
}};
Run Code Online (Sandbox Code Playgroud)

PS:一些可能有趣的文件,因为他们谈论多样性,但我不知道如何申请:

lucene search-engine elasticsearch elasticsearch-aggregation

14
推荐指数
1
解决办法
780
查看次数

将聚合结果插入索引

目标是构建一个Elasticsearch索引,其中只包含相关文档组中的最新文档,以跟踪某些监视计数器和状态的当前状态.

我制作了一个简单的Elasticsearch聚合查询:

{
  "size": 0,
  "aggs": {
    "group_by_monitor": {
      "terms": {
        "field": "monitor_name"
      },
      "aggs": {
        "get_latest": {
          "top_hits": {
            "size": 1,
            "sort": [
              {
                "timestamp": {
                  "order": "desc"
                }
              }
            ]
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它将相关文档分组到存储桶中,并为每个存储桶选择最新文档.

以下是我完成工作所需的不同想法:

  1. 直接使用聚合查询将结果推送到索引中,但似乎不可能:是否可以将ElasticSearch聚合的结果放回索引中?
  2. 使用Logstash Elasticsearch输入插件执行聚合查询和Elasticsearch输出插件以推入索引,但似乎输入插件只查看hits字段并且无法处理聚合结果:聚合查询可能的输入ES插件!
  3. 使用Logstash http_poller插件获取JSON文档,但似乎不允许为HTTP请求指定正文!
  4. 使用Logstash exec插件执行cURL命令来获取JSON,但这似乎非常麻烦,我的最后一.
  5. 使用NEST API构建一个基本应用程序,它将进行轮询,提取结果,清理它们并将结果文档注入目标索引,但我想避免添加一个新工具来维护.

是否有一种相当复杂的方法来实现这一目标?

elasticsearch logstash nest kibana elasticsearch-aggregation

9
推荐指数
1
解决办法
3638
查看次数

如何在不返回Elasticsearch中的所有存储区的情况下执行管道聚合

我正在使用Elasticsearch 2.3,我正在尝试使用管道聚合执行两步计算.我只对管道聚合的最终结果感兴趣,但Elasticsearch返回所有桶信息.

由于我有大量的桶(数十或数亿),这是令人望而却步的.不幸的是,我找不到告诉Es不要返回所有这些信息的方法.

这是一个玩具的例子.我有test-index一个文档类型的索引obj.obj有两个字段,keyvalues.

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 100,
  "key": "foo"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 20,
  "key": "foo"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 50,
  "key": "bar"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 60,
  "key": "bar"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 70,
  "key": "bar"
}'
Run Code Online (Sandbox Code Playgroud)

我想得到具有相同s 的s key的最小值的平均值(在所有s上).平均最小值.valueobjkey

Elasticsearch允许我这样做:

curl -XPOST 'http://10.10.0.7:9200/test-index/obj/_search' -d '{
  "size": 0,
  "query": …
Run Code Online (Sandbox Code Playgroud)

elasticsearch elasticsearch-aggregation

9
推荐指数
1
解决办法
2927
查看次数

弹性搜索中的模糊桶聚合

Elasticsearch支持模糊搜索查询:https://www.elastic.co/guide/en/elasticsearch/guide/2.x/fuzzy-match-query.html

并按期限进行分组聚合:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html

它说"......桶是动态构建的 - 每个唯一值都有一个."

是否可以通过模糊术语组合这两个特征和桶?那么例如"America"和"Amrica"会属于同一个桶吗?(使用"term"桶它们属于2个独立的桶,使用"模糊"搜索,返回两个记录.

我正在尝试分组包括拼写错误在内的"关键字" - 也许有不同的方法可以解决这个问题?(暴力是对每个"关键字"运行"模糊"搜索并手动添加数字...)

elasticsearch elasticsearch-aggregation

9
推荐指数
1
解决办法
525
查看次数

具有多个排除的Elasticsearch聚合查询

我在ES数据库中有一堆公司数据.我想要计算每个文件中出现的文件的数量,但是我在聚合查询时遇到了一些问题.我希望排除诸如"公司"或"公司"之类的术语 到目前为止,我已经能够按照以下代码一次成功完成一个任期.

{
    "aggs" : {
        "companies" : {
            "terms" : {
                "field" : "Companies.name",
                "exclude" : "corporation"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个回报

"aggregations": {
    "assignee": {
         "buckets": [
            {
               "key": "inc",
               "doc_count": 375
            },
            {
               "key": "company",
               "doc_count": 252
            }
         ]
     }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望能够做类似的事情

{
    "aggs" : {
        "companies" : {
            "terms" : {
                "field" : "Companies.name",
                "exclude" : ["corporation", "inc.", "inc", "co", "company", "the", "industries", "incorporated", "international"],
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我找不到一种不会引发错误的方法

我查看了ES文档中聚合的"术语"部分,并且只能找到单个排除的示例.我想知道是否可以排除多个术语,如果是,那么这样做的正确语法是什么.

注意:我知道我可以将字段设置为"not_analyzed"并获取完整公司名称的分组,而不是拆分名称.但是,由于分析允许存储桶更容忍名称变化(即微软公司和微软公司),我对此犹豫不决.

filter elasticsearch elasticsearch-aggregation

8
推荐指数
1
解决办法
4898
查看次数

跨多个索引的多个字段的 Elasticsearch 聚合

我有两个索引 - 一个用于Application模型,另一个用于Databases模型(多对多关系)。

每个文档都被非规范化以包含来自另一个模型的属性

Application
          |_ vendor_name
          |_ databases
                 |_ db_1
                 |_ db_2


Database
       |_ database_applications
                 |_ app_1
                        |_vendor_name
                 |_ app_2
                        |_ vendor_name
Run Code Online (Sandbox Code Playgroud)

对供应商名称执行多索引搜索 - 似乎我从两个索引中都得到了正确的结果。

挑战在 vendor_name 字段上正确聚合

当结果仅来自数据库时,使用以下聚合似乎有效。我也尝试过,field: '*vendor_name'但似乎不起作用。

我错过了什么?模型应该改变吗?

   aggregation:
       vendor_name: {
            terms: {
                field: "database_applications.vendor_name"
            }
        }
Run Code Online (Sandbox Code Playgroud)

更新1:

根据@Andrie-Stefan - 这是两个索引映射的更准确表示(缩写为简短):

数据库

Application
          |_ vendor_name
          |_ databases
                 |_ db_1
                 |_ db_2


Database
       |_ database_applications
                 |_ app_1
                        |_vendor_name
                 |_ app_2
                        |_ vendor_name
Run Code Online (Sandbox Code Playgroud)

应用

{
  "applications": {
    "aliases": {},
    "mappings": {
      "application": …
Run Code Online (Sandbox Code Playgroud)

elasticsearch elasticsearch-aggregation

8
推荐指数
1
解决办法
7223
查看次数

Elasticsearch SQL就像子查询聚合一样

我正在玩ES以了解它是否可以涵盖我的大部分场景.我正处于考虑如何在SQL中达到某些非常简单的结果的问题.

这是一个例子

在弹性我有一个索引与这些文件

{ "Id": 1,  "Fruit": "Banana", "BoughtInStore"="Jungle", "BoughtDate"=20160101,  "BestBeforeDate": 20160102, "BiteBy":"John"}
{ "Id": 2,  "Fruit": "Banana", "BoughtInStore"="Jungle", "BoughtDate"=20160102,  "BestBeforeDate": 20160104, "BiteBy":"Mat"}
{ "Id": 3,  "Fruit": "Banana", "BoughtInStore"="Jungle", "BoughtDate"=20160103,  "BestBeforeDate": 20160105, "BiteBy":"Mark"}
{ "Id": 4,  "Fruit": "Banana", "BoughtInStore"="Jungle", "BoughtDate"=20160104,  "BestBeforeDate": 20160201, "BiteBy":"Simon"}
{ "Id": 5,  "Fruit": "Orange", "BoughtInStore"="Jungle", "BoughtDate"=20160112,  "BestBeforeDate": 20160112, "BiteBy":"John"}
{ "Id": 6,  "Fruit": "Orange", "BoughtInStore"="Jungle", "BoughtDate"=20160114,  "BestBeforeDate": 20160116, "BiteBy":"Mark"}
{ "Id": 7,  "Fruit": "Orange", "BoughtInStore"="Jungle", "BoughtDate"=20160120,  "BestBeforeDate": 20160121, "BiteBy":"Simon"}
{ "Id": 8,  "Fruit": "Kiwi", "BoughtInStore"="Shop", "BoughtDate"=20160121, …
Run Code Online (Sandbox Code Playgroud)

group-by report elasticsearch elasticsearch-aggregation

8
推荐指数
1
解决办法
2295
查看次数

使用术语聚合执行搜索时如何返回实际值(不是小写)?

我正在研究一个 ElasticSearch (6.2) 项目,其中index有很多keyword字段,并且它们被标准化lowercase过滤器进行了执行不区分大小写的搜索。搜索工作良好并返回规范化字段的实际值(不是小写)。但是,聚合不返回字段的实际值(返回小写)。

以下示例取自 ElasticSearch 文档。

https://www.elastic.co/guide/en/elasticsearch/reference/master/normalizer.html

创建索引:

PUT 指数
{
  “设置”:{
    “分析”: {
      “规范化”:{
        “my_normalizer”:{
          "类型": "自定义",
          "char_filter": [],
          “过滤器”:[“小写”,“asciifolding”]
        }
      }
    }
  },
  “映射”:{
    “_doc”:{
      “特性”: {
        “富”:{
          “类型”:“关键字”,
          "normalizer": "my_normalizer"
        }
      }
    }
  }
}

插入文档:

PUT 索引/_doc/1
{
  "foo": "酒吧"
}

PUT 索引/_doc/2
{
  "foo": "巴兹"
}

聚合搜索:

获取索引/_search
{
  “大小”:0,
  “aggs”:{
    “foo_terms”:{
      “条款”:{
        “字段”:“foo”
      }
    }
  }
}

结果:

{
  “拿”:43,
  “timed_out”:假,
  “_shards”:{
    “总”:1,
    “成功”:1,
    “跳过”:0,
    “失败”:0
  }, …

elasticsearch elasticsearch-aggregation

8
推荐指数
1
解决办法
1675
查看次数

通过三分之一汇总和过滤从一个索引到另一个索引

在我Elasticsearch服务器我有三个指标:Person,ArchiveDocument.

  • 每个文档都有一个archive字段,它是_idArchive它在不在.

  • 每个归档有一个owner它是_idPerson那是存档的所有者.

通过上面的索引,我可以将文档聚合到存档和存档的存储桶中.

我怎样才能将文档包含在人员聚合中,这样如果我过滤特定的人,我会获得档案及其属于该人的文档,而不仅仅是档案?


这是我到目前为止过滤和汇总存档到业主的桶:

{
  "post_filter": {
    "terms": {
      "owner": [
        "my_owner_id"
      ]
    }
  },
  "aggs": {
    "_filter_archive": {
      "filter": {
        "terms": {
          "owner": [
            "my_owner_id"
          ]
        }
      },
      "aggs": {
        "archive": {
          "terms": {
            "field": "archive"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

search faceted-search elasticsearch elasticsearch-aggregation

7
推荐指数
1
解决办法
468
查看次数