重构Elasticsearch模型以实现快速聚合

时间:2019-01-16 07:52:20

标签: elasticsearch elasticsearch-aggregation

我的业务领域是房地产列表,我正在尝试构建一个多面的UI。因此,我需要进行汇总,以了解有多少个房源有1张床,2张床,在这个价格范围内有多少张床,有泳池的有几张等。

目前我的模型是这样的:

{
   "beds": 1,
   "baths": 1,
   "price": 100000,
   "features": ['pool','aircon'],
   "inspections": [{
      "startsOn": "2019-01-20"
   }]
}

要构建多面的UI,我需要进行多种聚合,例如:

{
   "aggs" : {
        "beds" : {
            "terms" : { "field" : "beds" }
        },
        "baths" : {
            "terms" : { "field" : "baths" }
        },
        "features" : {
            "terms" : { "field" : "features" }
        }
    }
}

您明白了。如果我有10个字段,那么我正在做10个聚合。

但是看到this article之后,我想我应该重新构建模型,就像这样:

{
   "beds": 1,
   "baths": 1,
   "price": 100000,
   "features": ['pool','aircon'],
   "attributes": ['bed_1','bath_1','price_100000-200000','has_pool','has_aircon','has_inspection_tomorrow']
}

然后我只需要1个agg:

{
   "aggs": {
      "attributes": {
         "terms": {
            "field": "attributes"
         }
       }
   }
}

所以我有几个问题。

  1. 这种方法的 only 缺点是逻辑转移到了客户端吗?如果是这样,我对此很满意-为了提高性能,因为我认为这种逻辑不会经常更改。
  2. 我也可以在我的查询中利用此字段吗?例如,如果我想将所有带有1个卧室的价格= 100000 的文档与一个池匹配,该怎么办。字词查询适用于“任意”匹配,但是我如何找到值数组包含 all 提供的条款的文档?

或者,如果您能想到更好的结构来建模以提高搜索速度,请告诉我!

谢谢

1 个答案:

答案 0 :(得分:0)

第二点,您可以使用terms set querydoc here)。

此查询类似于术语查询,但是您可以控制必须匹配的术语数。

您可以通过如下脚本进行配置:

GET /my-index/_search
{
    "query": {
        "terms_set": {
            "codes" : {
                "terms" : ["bed_1","bath_1","price_100000-200000"],
                "minimum_should_match_script": {
                   "source": "params.num_terms"
                }
            }
        }
    }
}

将要求所有参数匹配