【问题标题】:SQL Where clause equivalent for Elastic Search与 Elastic Search 等效的 SQL Where 子句
【发布时间】:2014-07-30 16:48:12
【问题描述】:

我正在尝试在弹性搜索中创建聚合结果,但过滤选项对我不起作用。

我可以在没有过滤器的情况下聚合数据,例如

select  name , material ,sum(price)
from products group by name , material 

curl -XGET 'http://localhost:9200/products/_search?pretty=true' -d' 
{
    "aggs" : {
        "product" : {
            "terms" : {
                "field" : "name"
            },
            "aggs" : {
                "material" : {
                    "terms" : {
                        "field" : "material"
                    },
                    "aggs" : {
                        "sum_price" : {
                            "sum" : {
                                "field" : "price"
                            }
                        }
                    }
                }
            }
        }
    },
    "size" : 0
}'

但我在编写等效的 DSL 查询时遇到了问题:

select  name , material ,sum(price)
from products 
where material = "wood"
group by name , material 

【问题讨论】:

  • query 子句添加到您的请求中,其中包含术语查询

标签: sql elasticsearch lucene dsl equivalent


【解决方案1】:

应该是这样的:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "material": "wood"
        }
      }
    }
  },
    "aggs" : {
        "product" : {
            "terms" : {
                "field" : "name"
            },
            "aggs" : {
                "material" : {
                    "terms" : {
                        "field" : "material"
                    },
                    "aggs" : {
                        "sum_price" : {
                            "sum" : {
                                "field" : "price"
                            }
                        }
                    }
                }
            }
        }
    },
    "size" : 0
}

如果您知道确切的值并且不需要匹配,则使用过滤器,否则使用匹配查询而不是过滤后的查询。

【讨论】:

    【解决方案2】:

    你可以使用匹配

    {
      "query": {
        "bool": {
          "must": [
            {            
              "match": {
                "material": "wood"
              }
            }
          ],
          "filter": [
            {
              "match_all": {}
            },
          ]
        }  
      },
        "aggs" : {
            "product" : {
                "terms" : {
                    "field" : "name"
                },
                "aggs" : {
                    "material" : {
                        "terms" : {
                            "field" : "material"
                        },
                        "aggs" : {
                            "sum_price" : {
                                "sum" : {
                                    "field" : "price"
                                }
                            }
                        }
                    }
                }
            }
        },
        "size" : 0
    }  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多