Случайный документ в ElasticSearch

есть ли способ получить действительно случайную выборку из индекса elasticsearch? т. е. запрос, который извлекает любой документ из индекса с вероятностью 1/N (где N количество документов в настоящее время индексируется)?

и в качестве последующего вопроса: если все документы имеют некоторое числовое поле s, есть ли способ получить документ через взвешенную случайную выборку, т. е. где вероятность получить документ i со значением s_i равна s_i / sum(s_j for j in index)?

4 ответов


Я знаю, это старый вопрос, но теперь можно использовать random_score, со следующим поисковым запросом:

{
   "size": 1,
   "query": {
      "function_score": {
         "functions": [
            {
               "random_score": {
                  "seed": "1477072619038"
               }
            }
         ]
      }
   }
}

для меня это очень быстро, около 2 миллионов документов.

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


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

sort: {
  _script: {
    script: "Math.random() * 200000",
    type: "number",
    params: {},
    order: "asc"
 }
}

вы можете использовать этот скрипт, чтобы сделать некоторые веса на какое-то поле записи.

возможно, в будущем они могут добавить что-то более сложное, но вам, вероятно, придется запросить это у команды ES.


Вы можете использовать random_score с function_score запрос.

{
    "size":1,
    "query": {
        "function_score": {
            "functions": [
                {
                    "random_score":  {
                        "seed": 11
                    }
                }
            ],
            "score_mode": "sum",
        }
    }
}

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


можно использовать random_score случайным образом заказать ответы или получить документ с примерно 1/N вероятность.

дополнительно:

https://github.com/elastic/elasticsearch/issues/1170 https://github.com/elastic/elasticsearch/issues/7783