elasticsearch 使用elasticsearch连接查询和聚合,elasticsearch,join,elasticsearch,Join" /> elasticsearch 使用elasticsearch连接查询和聚合,elasticsearch,join,elasticsearch,Join" />

elasticsearch 使用elasticsearch连接查询和聚合

elasticsearch 使用elasticsearch连接查询和聚合,elasticsearch,join,elasticsearch,Join,使用ElasticSearch 5.4.2,考虑如下映射: "mappings": { "product": { "properties": { "enabled": { "type": "boolean" }, // etc... } }, "cartproduct": { "properties": {

使用ElasticSearch 5.4.2,考虑如下映射:

"mappings": {
    "product": {
        "properties": {
            "enabled": {
                "type": "boolean"
            },
            // etc...
        }
    },
    "cartproduct": {
        "properties": {
            "productId": {
                "type": "keyword"
            },
            // etc...
        }
    }
}
我想通过
productId
enabled:true
产品聚合
cartproduct

目前,我正在这样做。聚合工作正常,但与产品无关(意味着已禁用的产品被聚合,这是不可能的):

如果我尝试在这个查询中添加
enabled
,它显然表示该字段不存在。但是如果我在
产品
上下文中搜索,我无法聚合结果

是否有一种方法可以实现这一点,而无需在
cartproduct
文档中添加
enabled

谢谢

编辑

一些文件样本:

// product
{
    "_index": "store",
    "_type": "product",
    "_id": "product:8ca2713e",
    "_version": 1,
    "_score": 1,
    "_source": {
        "categories": [
            10
        ],
        "enabled": true,    <--- MATCH THIS FIELD
        "userinput": false,
        "createdAt": "2017-08-14T16:11:10.182Z",
        "updatedAt": "2017-08-14T16:11:40.978Z",
        "title": "Tart"
    }
}

// cartproduct
{
    "_index": "store",
    "_type": "cartproduct",
    "_id": "cartproduct:6048764d",
    "_version": 1,
    "_score": 1,
    "_source": {
        "createdAt": "2017-08-16T16:45:39.978Z",
        "productTitle": "Tart",
        "productId": "8ca2713e", <-- AGGREGATE ON THIS FIELD
        "hasComment": false
    }
}
//产品
{
“_索引”:“存储”,
“_类型”:“产品”,
“_id”:“产品:8ca2713e”,
“_版本”:1,
“_分数”:1,
“_来源”:{
“类别”:[
10
],

“enabled”:是的,为什么您将搜索限制为仅搜索cartproduct类型?假设您希望在整个索引中聚合productid,可以通过以下方式替代此类型级别限制,以满足您的要求

{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "enabled": "true"
        }
      }
    },
    "aggs": {
      "products": {
        "terms": {
          "field": "productId"
        }
      }
    }
  }
}

在对文档进行了一些挖掘和理解后,我找到了一个有效的解决方案:

"mappings": {
    // ...
    "cartproduct": {
        "_parent": {
            "type": "product"
        },
        "properties": {
            "productId": {
                "type": "keyword"
            },
            // etc...
        }
    }
}
和搜索查询:

{
    "query": {
        "has_parent": {
            "parent_type": "product",
            "query": {
                "term": {
                    "enabled": true
                }
            }
        }
    },
    "aggs": {
        "products": {
            "terms": {
                "field": "productId"
            }
        }
    }
}

您可以发布产品和cartproduct类型的示例文档吗?谢谢您的快速回答。我尝试了,但没有聚合。我有点击(已启用的产品),但“产品”聚合中没有任何内容。我是否遗漏了什么?事实上,点击是“产品”文档,但聚合字段在“cartproduct”中定义文档。这正是我要发布的解决方案,但在发布之前刷新了页面;)。基本上,您的问题属于连接类别,这里讨论了3种可能的解决方案
{
    "query": {
        "has_parent": {
            "parent_type": "product",
            "query": {
                "term": {
                    "enabled": true
                }
            }
        }
    },
    "aggs": {
        "products": {
            "terms": {
                "field": "productId"
            }
        }
    }
}