如何计算弹性搜索中嵌套字段中的对象数?

时间:2018-02-20 08:45:20

标签: elasticsearch

如何计算弹性搜索中嵌套字段中的对象数? 样本映射:

"base_keywords": {
  "type": "nested",
  "properties": {
    "base_key": {
      "type": "text"
    },
    "category": {
      "type": "text"
    },
    "created_at": {
      "type": "date"
    },
    "date": {
      "type": "date"
    },
    "rank": {
      "type": "integer"
    }
  }
}

我想计算嵌套字段'base_keywords'中的对象数。

2 个答案:

答案 0 :(得分:0)

Aggs通常适用于计数和分组,对于嵌套文档,您可以使用嵌套的aggs:

  "aggs": {
    "MyAggregation1": {
      "terms": {
        "field": "FieldA",
        "size": 0
      },
      "aggs": {
        "BaseKeyWords": {
          "nested": { "path": "base_keywords" },
          "aggs": {
            "BaseKeys": {
              "terms": {
                "field": "base_keywords.base_key.keyword",
                "size": 0
              }
            }
          }
        }
      }
    }
  }

您没有指定要计算的内容,但aggs对于分组和计数数据非常灵活。 “doc_count”和“key”的行为类似于+ count()

的sql组

更新(假设您有一个.keyword字段创建“keys”值,因为“text”类型的属性无法聚合或计算:

{
  "aggs": {
    "MyKeywords1Agg": {
      "nested": { "path": "keywords1" },
      "aggs": {
        "NestedKeywords": {
          "terms": {
            "field": "keywords1.keys.keyword",
            "size": 0
          }
        }
      }
    }
  }
}

只需计算嵌套键的数量,您就可以这样做:

{
  "aggs": {
    "MyKeywords1Agg": {
      "nested": { "path": "keywords1" }
    }
  }
}

如果要对“主”文档或嵌套文档上的字段值进行一些分组,则必须扩展映射/数据模型以包含可聚合的术语,其中包括elasticsearch中的大多数数据类型,但“text”,例如:日期,数字,地理位置,关键字。

编辑: 聚合每个顶级文档的唯一标识符的示例,假设您有一个名为“WordMappingId”的属性为整数

{
  "aggs": {
    "word_maping_agg": {
      "terms": {
        "field": "WordMappingId",
        "size": 0,
        "missing": -1
      },
      "aggs": {
        "Keywords1Agg": null,
        "nested": { "path": "keywords1" }
      }
    }
  }
}

如果您没有在顶层的“word_maping”文档中添加任何属性,则无法对每个唯一文档进行聚合。内置_id字段默认情况下不可聚合,我建议您在顶层的源数据中包含一个唯一标识符以进行聚合。

注意:“missing”参数会将所有没有设置WordMappingId属性的文档放在一个带有提供值的文本中,这样可以确保您没有遗漏搜索结果中的任何文档。

Aggs可以在SQL中支持类似于组的行为,但是您需要实际对其进行分组,并且根据您提供的映射,索引中当前没有此类字段。

答案 1 :(得分:0)

您需要使用内联脚本来执行此操作。这对我有用:(使用ES 6.x):

GET your-indices/_search
{

  "aggs": {
    "whatever": {
      "sum": {
        "script": {
          "inline": "params._source.base_keywords.size()"
        }
      }
    }
  }
}