弹性搜索聚合查询



我正在做一个关于烹饪食谱的项目。我安装了 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"}}
       ]
    }

只想有一个查询来获取所有这些查询的结果,我只想要最便宜的查询,而不是所有列表。

您可以为查询中的每个产品定义筛选器聚合

{
    "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"
                       ]
                    }
                }
            }
        }
    }
}

每个聚合都会构建一个与您的筛选条件对应的存储桶。然后,您将向每个存储桶添加一个命中率最高的子聚合,以获得最低价格。例如,对于 sel 存储桶:

{
    "aggs" : {
        "sel" : {
            "filter" : {
                "query_string": {
                   "query": "sel",
                   "fields": [
                      "titre"
                   ]
                }
            },
            "aggs" : {
                "minprice": {
                    "top_hits": {
                        "sort": [
                            {
                                "prix en €/kg": {
                                    "order": "asc"
                                }
                            }
                        ],
                        "size" : 1
                    }
                }
            }
        }
    }
}

还有一个更完整的例子,包括塞尔西罗科利哈里科特

{
    "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
                            ]
                        }
                    ]
                }
            }
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新