隐形弹性搜索领域

时间:2015-08-01 11:00:38

标签: elasticsearch

我有一个弹性搜索模式,如下所示

{
  "customer": {
    "properties": {
        "id": {"type": "string", "index": "not_analyzed"}
    }
  }
}

{
  "activity": {
    "parent": {
      "type": "customer"
    },
    "routing": {
        "required": true,
        "path": "customer.id"
    },
    "properties": {
        ...
        // The parent object is included on activity
        "customer": {
            "properties": {
                "id": {"type": "string", "index": "not_analyzed"}
            }
          }
    }
  }
}

客户的活动和活动是客户类型的子女。我也直接在活动类型上提供客户。

如果我现在针对活动类型

编写术语过滤器
{
    "terms": {
        "field": "customer.id"
    }
}

其中读取的内容是 - 属于同一客户的所有活动。

令人惊讶的是,这个存储桶activity.id而不是activity.customer.id。我很难过。真的很棒。

我认为这与亲子关系有关?我能够通过这样做得到我想要的东西

{
    "terms": {
        "field": "_parent"
    }
}

我不明白这一点。有人可以指出我做错了吗?

1 个答案:

答案 0 :(得分:1)

最近在this blog article中描述了这个问题,这也是ES 2.0将围绕映射进行大量重构的原因之一。简而言之,此处的问题是,在您的映射中,customer既是类型名称又是字段名称,因此customer.id可以引用id的{​​{1}}字段在customer类型中输入id对象的类型或customer字段。

因此,如果您使用以下完全限定的字段名称,它应该按预期工作:

activity