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

У нас есть документ ES об автопарках, в котором есть следующие пары ключ-значение:

{
  "stockid":1,
  "car": "bmw"
  "dealerid": "d1"
},
{
  "stockid":2,
  "car": "audi"
  "dealerid": "d1"
},,
{
  "stockid":3,
  "car": "mercedes"
  "dealerid": "d1"
},,
{
  "stockid":4,
  "car": "bentley"
  "dealerid": "d2"
},
{
  "stockid":5,
  "car": "range rover"
  "dealerid": "d1"
}

Таких документов тысячи. В документе гораздо больше полей, я просто упростил его и указал только те поля, которые необходимы для понимания запроса.

Мы хотим выбрать N акций случайным образом на основе dealerid. Например, если кто-то запрашивает вышеуказанный документ о запасах, существует равная вероятность получить запасы "d1" или "d2", несмотря на то, что у дилера "d1" 4 акции, а у "d2" только 1. Таких документов тысячи с тысячами. дилеров тоже с "d1" на "dXXXX", и этот список постоянно меняется.

Может ли кто-нибудь помочь мне написать этот эластичный запрос?


person Sahil Sharma    schedule 09.10.2017    source источник


Ответы (1)


Готовы ли вы реструктурировать свой индекс? Вы можете использовать родительский дочерний элемент. подход. dealers - родители, stocks - дети, тогда вы можете легко использовать случайное начальное число для запроса дилеров или акций каждого дилера, поскольку документы будут уникальными.

Вы должны иметь возможность реплицировать свои текущие запросы, запрашивая stocks потомков, поскольку вы все еще можете получить доступ к родительским полям денормализованным способом, используя has_parent (или has_child в противоположном направлении)

PUT / автомобили

{
    "mappings" : {
        "dealers" : { },
        "stocks" : {
            "_parent" : {
                "type" : "dealers"
            }
        }
    }
}

GET / автомобили / дилеры / _search

{
    "query" : {
        "function_score" : {
            "functions" : [
                {
                    "random_score" : {
                        "seed" : "randawefawfm" // generate this
                    }
                }
            ]
        }
    },
    "size" : N
}
person yyssw    schedule 10.10.2017