Запрос ElasticSearch на основе минимального ранга - PullRequest
0 голосов
/ 29 марта 2019

Мы пытаемся перенести наш поиск недвижимости с 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"
    ]

Я не уверен, что это правильный подход, и если да, то как собрать все это в один запрос. Я также вижу ссылки на Агрегация селектора ковшей и Макс. Агрегация ковша , и они выглядят многообещающими. Я новичок в ElasticSearch, поэтому любая помощь надлежащим образом для достижения моей цели будет оценена.

...