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