Случайный документ в 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