我们正尝试将房地产属性搜索从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查询:
我一直在阅读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 Aggregation和Max Bucket Aggregation的引用,它们看起来很有希望。我是ElasticSearch的新手,因此以适当方式实现我的目标的任何帮助将不胜感激。