Elasticsearch 聚合查询
Elasticsearch aggregation queries
我正在做一个关于烹饪食谱的项目。我安装了Elasticsearch 1.5.2,我在超市的很多索引中添加了很多产品,比如蔬菜或肉类。在我开始聚合查询之前一切都很好。例如:要制作土豆泥,我需要土豆、豆类、鹰嘴豆、西兰花、牛奶、胡椒粉和盐。我有所有这些产品存储。我需要进行一次查询以在所有索引中搜索该产品中最便宜的产品。我尝试了很多查询,但没有找到我需要的。
这是示例,所有这些查询都有效,但我需要一个查询中的结果:
POST /_search
{
"query": {
"query_string": {
"query": "pommes de terre",
"fields": [
"titre"
]
}
},
"sort" : [
{"prix en €/kg" : {"order" : "asc"}}
]
}
POST /_search
{
"query": {
"query_string": {
"query": "haricots",
"fields": [
"titre"
]
}
},
"sort" : [
{"prix en €/kg" : {"order" : "asc"}}
]
}
POST /_search
{
"query": {
"query_string": {
"query": "pois chiche",
"fields": [
"titre"
]
}
},
"sort" : [
{"prix en €/kg" : {"order" : "asc"}}
]
}
POST /_search
{
"query": {
"query_string": {
"query": "brocoli",
"fields": [
"titre"
]
}
},
"sort" : [
{"prix en €/kg" : {"order" : "asc"}}
]
}
POST /_search
{
"query": {
"query_string": {
"query": "lait",
"fields": [
"tags"
]
}
},
"sort" : [
{"prix en €/L" : {"order" : "asc"}}
]
}
POST /_search
{
"query": {
"query_string": {
"query": "poivre",
"fields": [
"tags"
]
}
},
"sort" : [
{"prix en €/kg" : {"order" : "asc"}}
]
}
POST /_search
{
"query": {
"query_string": {
"query": "sel",
"fields": [
"tags"
]
}
},
"sort" : [
{"prix en €/kg" : {"order" : "asc"}}
]
}
我只想用一个查询来获取所有这些查询的结果,而且我只想要最便宜的,而不是所有列表。
您可以为查询中的每个产品定义一个 filter aggregation
{
"aggs" : {
"sel" : {
"filter" : {
"query_string": {
"query": "sel",
"fields": [
"titre"
]
}
}
},
"haricots" : {
"filter" : {
"query_string": {
"query": "haricots",
"fields": [
"titre"
]
}
}
}
}
}
请注意,在 ES<2 上,您 在 query
对象中:
{
"aggs" : {
"sel" : {
"filter" : {
"query": {
"query_string": {
"query": "sel",
"fields": [
"titre"
]
}
}
}
},
"haricots" : {
"filter" : {
"query": {
"query_string": {
"query": "haricots",
"fields": [
"titre"
]
}
}
}
}
}
}
每个聚合都会构建一个与您的过滤器相对应的存储桶。然后,您可以向这些桶中的每一个添加 top hits sub aggregation 以获得最低价格。例如,使用 sel 存储桶:
{
"aggs" : {
"sel" : {
"filter" : {
"query_string": {
"query": "sel",
"fields": [
"titre"
]
}
},
"aggs" : {
"minprice": {
"top_hits": {
"sort": [
{
"prix en €/kg": {
"order": "asc"
}
}
],
"size" : 1
}
}
}
}
}
}
以及 sel、brocoli 和 haricots
的更完整示例
{
"aggs" : {
"sel" : {
"filter" : {
"query_string": {
"query": "sel",
"fields": [
"titre"
]
}
},
"aggs" : {
"minprice": {
"top_hits": {
"sort": [
{
"prix en €/kg": {
"order": "asc"
}
}
],
"size" : 1
}
}
}
},
"haricots" : {
"filter" : {
"query_string": {
"query": "haricots",
"fields": [
"titre"
]
}
},
"aggs" : {
"minprice": {
"top_hits": {
"sort": [
{
"prix en €/kg": {
"order": "asc"
}
}
],
"size" : 1
}
}
}
},
"brocoli" : {
"filter" : {
"query_string": {
"query": "brocoli",
"fields": [
"titre"
]
}
},
"aggs" : {
"minprice": {
"top_hits": {
"sort": [
{
"prix en €/kg": {
"order": "asc"
}
}
],
"size" : 1
}
}
}
}
}
}
你的结果看起来像
{
"aggregations" : {
"sel" : {
"doc_count" : 2,
"minprice" : {
"hits" : {
"total" : 2,
"max_score" : null,
"hits" : [
{
"_index" : "test",
"_type" : "product",
"_id" : "1",
"_score" : null,
"_source" : {
"id" : 1,
"titre" : "sel 1",
"prix en €/kg" : 1
},
"sort" : [
1.0
]
}
]
}
}
},
"haricots" : {
"doc_count" : 1,
"minprice" : {
"hits" : {
"total" : 1,
"max_score" : null,
"hits" : [
{
"_index" : "test",
"_type" : "product",
"_id" : "3",
"_score" : null,
"_source" : {
"id" : 3,
"titre" : "haricots",
"prix en €/kg" : 3
},
"sort" : [
3.0
]
}
]
}
}
}
}
}
我正在做一个关于烹饪食谱的项目。我安装了Elasticsearch 1.5.2,我在超市的很多索引中添加了很多产品,比如蔬菜或肉类。在我开始聚合查询之前一切都很好。例如:要制作土豆泥,我需要土豆、豆类、鹰嘴豆、西兰花、牛奶、胡椒粉和盐。我有所有这些产品存储。我需要进行一次查询以在所有索引中搜索该产品中最便宜的产品。我尝试了很多查询,但没有找到我需要的。
这是示例,所有这些查询都有效,但我需要一个查询中的结果:
POST /_search
{
"query": {
"query_string": {
"query": "pommes de terre",
"fields": [
"titre"
]
}
},
"sort" : [
{"prix en €/kg" : {"order" : "asc"}}
]
}
POST /_search
{
"query": {
"query_string": {
"query": "haricots",
"fields": [
"titre"
]
}
},
"sort" : [
{"prix en €/kg" : {"order" : "asc"}}
]
}
POST /_search
{
"query": {
"query_string": {
"query": "pois chiche",
"fields": [
"titre"
]
}
},
"sort" : [
{"prix en €/kg" : {"order" : "asc"}}
]
}
POST /_search
{
"query": {
"query_string": {
"query": "brocoli",
"fields": [
"titre"
]
}
},
"sort" : [
{"prix en €/kg" : {"order" : "asc"}}
]
}
POST /_search
{
"query": {
"query_string": {
"query": "lait",
"fields": [
"tags"
]
}
},
"sort" : [
{"prix en €/L" : {"order" : "asc"}}
]
}
POST /_search
{
"query": {
"query_string": {
"query": "poivre",
"fields": [
"tags"
]
}
},
"sort" : [
{"prix en €/kg" : {"order" : "asc"}}
]
}
POST /_search
{
"query": {
"query_string": {
"query": "sel",
"fields": [
"tags"
]
}
},
"sort" : [
{"prix en €/kg" : {"order" : "asc"}}
]
}
我只想用一个查询来获取所有这些查询的结果,而且我只想要最便宜的,而不是所有列表。
您可以为查询中的每个产品定义一个 filter aggregation
{
"aggs" : {
"sel" : {
"filter" : {
"query_string": {
"query": "sel",
"fields": [
"titre"
]
}
}
},
"haricots" : {
"filter" : {
"query_string": {
"query": "haricots",
"fields": [
"titre"
]
}
}
}
}
}
请注意,在 ES<2 上,您 query
对象中:
{
"aggs" : {
"sel" : {
"filter" : {
"query": {
"query_string": {
"query": "sel",
"fields": [
"titre"
]
}
}
}
},
"haricots" : {
"filter" : {
"query": {
"query_string": {
"query": "haricots",
"fields": [
"titre"
]
}
}
}
}
}
}
每个聚合都会构建一个与您的过滤器相对应的存储桶。然后,您可以向这些桶中的每一个添加 top hits sub aggregation 以获得最低价格。例如,使用 sel 存储桶:
{
"aggs" : {
"sel" : {
"filter" : {
"query_string": {
"query": "sel",
"fields": [
"titre"
]
}
},
"aggs" : {
"minprice": {
"top_hits": {
"sort": [
{
"prix en €/kg": {
"order": "asc"
}
}
],
"size" : 1
}
}
}
}
}
}
以及 sel、brocoli 和 haricots
的更完整示例{
"aggs" : {
"sel" : {
"filter" : {
"query_string": {
"query": "sel",
"fields": [
"titre"
]
}
},
"aggs" : {
"minprice": {
"top_hits": {
"sort": [
{
"prix en €/kg": {
"order": "asc"
}
}
],
"size" : 1
}
}
}
},
"haricots" : {
"filter" : {
"query_string": {
"query": "haricots",
"fields": [
"titre"
]
}
},
"aggs" : {
"minprice": {
"top_hits": {
"sort": [
{
"prix en €/kg": {
"order": "asc"
}
}
],
"size" : 1
}
}
}
},
"brocoli" : {
"filter" : {
"query_string": {
"query": "brocoli",
"fields": [
"titre"
]
}
},
"aggs" : {
"minprice": {
"top_hits": {
"sort": [
{
"prix en €/kg": {
"order": "asc"
}
}
],
"size" : 1
}
}
}
}
}
}
你的结果看起来像
{
"aggregations" : {
"sel" : {
"doc_count" : 2,
"minprice" : {
"hits" : {
"total" : 2,
"max_score" : null,
"hits" : [
{
"_index" : "test",
"_type" : "product",
"_id" : "1",
"_score" : null,
"_source" : {
"id" : 1,
"titre" : "sel 1",
"prix en €/kg" : 1
},
"sort" : [
1.0
]
}
]
}
}
},
"haricots" : {
"doc_count" : 1,
"minprice" : {
"hits" : {
"total" : 1,
"max_score" : null,
"hits" : [
{
"_index" : "test",
"_type" : "product",
"_id" : "3",
"_score" : null,
"_source" : {
"id" : 3,
"titre" : "haricots",
"prix en €/kg" : 3
},
"sort" : [
3.0
]
}
]
}
}
}
}
}