基于最小排名的ElasticSearch查询

时间:2019-03-29 14:28:25

标签: elasticsearch elasticsearch-aggregation

我们正尝试将房地产属性搜索从SQL Server移植到ElasticSearch。每个属性可以有多个列表,我们将其作为子数组直接存储在每个记录中,如下所示:

{
    "_index": "residentialproperties",
    "_type": "residentialproperties",
    "_source": {
        "geoPoint": {
            "lat": 33.67654,
            "lon": -117.790335
        },
        "propertyId": 18023335652,
        "latitude": 33.67654,
        "longitude": -117.790335,
        "listings": [{
                "orgId": "",
                "listingId": "",
                "offMarketDate": "2001-07-06T00:00:00",
                "soldPrice": 273000,
                "bedrooms": 3,
                "bathrooms": 3,
                "livingAreaInSqFt": 1653,
                "yearBuilt": 1980,
                "rank": 3
            },
            {
                "orgId": "caclaw-n",
                "listingId": "11234029",
                "offMarketDate": "2015-02-12T00:00:00",
                "soldPrice": 325000,
                "bedrooms": 4,
                "bathrooms": 3,
                "livingAreaInSqFt": 1646,
                "yearBuilt": 1980,
                "rank": 2
            }
        ]
    }
}

将属性/列表导入到ElasticSearch中时,我们具有确定每个列表“排名”的业务逻辑,因此我们知道哪个列表是“首选”的,并且应将给定属性显示给特定用户。这不只是在每个列表上设置“ isPreferred”值,或者使用等级为1的列表都不简单,因为执行属性搜索的用户可能无法访问某些列表(它们位于不同的MLS中)。我想编写一个执行以下操作的ElasticSearch查询:

  1. 根据属性的列表值过滤属性(例如,卧室= 3)
  2. 确定每个剩余物业列表的最低排名
  3. 过滤其余属性的列表,仅包括那些具有等级=最低排名的属性(基本上只获得1个首选列表)
  4. 按列表值对过滤后的属性及其过滤后的列表进行排序,这意味着排序需要应用于首选列表(例如,浴室asc)

我一直在阅读ElasticSearch文档,认为我可能需要做类似的事情:

步骤1:

"query": {
        "filtered": {
           "query": {
                "match_all": {}
           },
           "filter": {
               "term": {
                  "listings.bedrooms": 3
               }
           }
        }
    }

第2步:

"aggs" : {
        "min_rank" : { "min" : { "field" : "listings.rank" } }
    }

第3步:

"post_filter": { 
    "term": { "listings.rank": "min_rank" }
  }

第4步:

"sort" : [
        { "listings.bathrooms" : {"order" : "asc"}},
        "_score"
    ]

我不确定这是否是正确的方法,如果可以,如何将它们全部合并到一个查询中。我还看到了对Bucket Selector AggregationMax Bucket Aggregation的引用,它们看起来很有希望。我是ElasticSearch的新手,因此以适当方式实现我的目标的任何帮助将不胜感激。

0 个答案:

没有答案