【问题标题】:Count instances of a field in ElasticSearch index计算 ElasticSearch 索引中字段的实例
【发布时间】:2018-03-13 14:51:09
【问题描述】:

我很好奇在给定 ElasticSearch 索引中计算所有文档中特定字段实例的最佳方法。

例如,如果我在索引goober 中有以下文档:

{
    '_id':'foo',
    'field1':'a value',
    'field2':'a value'
},
{
    '_id':'bar',
    'field1':'a value',
    'field2':'a value'
},
{
    '_id':'baz',
    'field1':'a value',
    'field3':'a value'
}

我想知道以下内容:

{
    'index':'goober',
    'field_counts':
        'field1':3,
        'field2':2,
        'field3':1
}

这可以通过单个查询来实现吗?还是多个?对于它的价值,我正在使用 python elasticsearchelasticsearch-dsl 客户端。

我已成功向/goober 发出GET 请求并检索了映射,并且正在学习如何提交每个字段的聚合请求,但我有兴趣了解特定字段出现的次数所有文件。

从使用 Solr 开始,我仍然对 ES 有所了解。提前感谢您的任何建议。

【问题讨论】:

    标签: python elasticsearch


    【解决方案1】:

    下面将返回带有“field2”的文档数:

    POST /INDEX/_search
    {
      "size": 0, 
      "query": {
        "bool": {
          "filter": {
            "exists": {
              "field": "field2"
            }
          }
        }
      }
    }
    

    这是一个使用多个聚合的示例(将返回桶中的每个聚合并带有计数),使用字段存在计数:

    POST /INDEX/_search
    {
      "size": 0,
      "aggs": {
        "field_has1": {
          "filter": {
            "exists": {
              "field": "field1"
            }
          }
        },
        "field_has2": {
          "filter": {
            "exists": {
              "field": "field2"
            }
          }
        }
      }
    }
    

    第二个示例中每个 agg 中的行为将模仿第一个查询的行为。在许多情况下,您可以使用常规搜索查询并将这些查找嵌套在聚合存储桶中。

    【讨论】:

    • 这正是我想要的!非常感谢。
    【解决方案2】:

    根据现有答案快速节省时间:

    interesting_fields = ['field1', 'field2']
    
    body = {
        'size': 0,
        'aggs': {f'has_{field_name}': {
            "filter": {
                "exists": {
                    "field": f'export.{field_name}'
                }
            }
        } for field_name in interesting_fields},
    }
    
    print(requests.post('http://localhost:9200/INDEX/_search', json=body).json())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 2020-02-07
      相关资源
      最近更新 更多