在弹性搜索中使用聚合与过滤器

时间:2014-12-21 10:36:56

标签: elasticsearch pyelasticsearch

我使用类似这样的文档进行弹性搜索:

{
  id: 1,
  price: 620000,
  propertyType: "HO",
  location: {
    lat: 51.41999,
    lon: -0.14426
  },
  active: true,
  rentOrSale: "S",
}

我尝试使用聚合来获取使用聚合的特定区域的统计信息,我使用的查询如下:

{
  "sort": [
    {
      "id": "desc"
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "rentOrSale": "s"
          }
        },
        {
          "term": {
            "active": true
          }
        }
      ]
    },
    "filtered": {
      "filter": {
        "and": [
          {
            "geo_distance": {
              "distance": "15.0mi",
              "location": {
                "lat": 51.50735,
                "lon": -0.12776
              }
            }
          }
        ]
      }
    }
  },
  "aggs": {
    "propertytype_agg": {
      "terms": {
        "field": "propertyType"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "bed_agg": {
      "terms": {
        "field": "numberOfBedrooms"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

但是在结果中我无法看到聚合。一旦我删除了bool或过滤的部分查询,我就可以看到聚合。我无法弄清楚为什么会发生这种情况,也不知道如何获得这些过滤器的聚合。我已尝试使用此question的答案,但我无法解决此问题。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为您的查询需要稍微重新安排 - 移动"过滤"进一步重复"查询"命令:

"query": {
  "filtered": {
   "query" : {
     "bool": {
          ...
     }
   },  
   "filter": {
    ...     
    }
  }
}