Мы пытаемся перенести наш поиск недвижимости с 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, который выполняет следующее:
- Фильтрует свойства по их списочным значениям (например, спальни = 3)
- Определяет минимальный ранг для каждого оставшегося списка недвижимости
- Фильтрует списки оставшихся свойств, включая только те, которые имеют ранг = минимальный ранг (в основном просто получают 1 предпочтительный список)
- Сортировка отфильтрованных свойств и их отфильтрованных списков по значению списка, что означает, что сортировка должна применяться к предпочтительному списку (например, ванные комнаты 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"
]
Я не уверен, что это правильный подход, и если да, то как собрать все это в один запрос. Я также вижу ссылки на Агрегация селектора ковшей и Макс. Агрегация ковша , и они выглядят многообещающими. Я новичок в ElasticSearch, поэтому любая помощь надлежащим образом для достижения моей цели будет оценена.