Модель реструктуризации Elasticsearch для быстрых агрегаций - PullRequest
0 голосов
/ 16 января 2019

Мой бизнес-домен - это списки недвижимости, и я пытаюсь создать граненый интерфейс. Поэтому мне нужно сделать агрегации, чтобы узнать, сколько в списках 1 кроватей, 2 кроватей, сколько в этом ценовом диапазоне, сколько с бассейном и т. Д. И т. Д. Довольно стандартные вещи.

В настоящее время моя модель выглядит так:

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

Чтобы построить мой граненый интерфейс, я делаю несколько агрегаций, например:

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

Вы поняли идею. Если у меня есть 10 полей, я делаю 10 агрегаций.

Но, увидев эту статью , я думаю, что мне следует просто перестроить свою модель, чтобы она была такой:

{
   "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 агг:

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

Итак, у меня есть пара вопросов.

  1. Является ли недостатком только в этом подходе то, что логика перемещается на клиент? Если это так, я доволен этим - для производительности, так как я не вижу, чтобы эта логика менялась очень часто.
  2. Могу ли я использовать это поле в моих запросах тоже? Например, что, если я хочу сопоставить все документы с 1 спальней и цена = 100000 и с пулом и т. Д. Запросы условий работают на любом совпадении, но как это сделать? я нахожу документы, где массив значений содержит все предоставленные термины?

В качестве альтернативы, если вы можете придумать лучшую структуру для моделирования скорости поиска, пожалуйста, дайте мне знать!

Спасибо

1 Ответ

0 голосов
/ 16 января 2019

Для второго пункта вы можете использовать terms set query ( документ здесь ).

Этот запрос похож на запрос терминов, но вы будете контролировать, сколько терминов должно совпадать.

Вы можете настроить его с помощью такого скрипта:

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

потребует, чтобы все параметры соответствовали

...