Muestreo aleatorio ponderado en Elasticsearch
Necesito obtener una muestra aleatoria de un índice ElasticSearch, es decir, emitir una consulta que recupere algunos documentos de un índice dado con probabilidad ponderadaWj/ΣWi
(dóndeWj
es un peso de filaj
yWj/ΣWi
es una suma de pesos de todos los documentos en esta consulta).
Actualmente, tengo la siguiente consulta:
GET products/_search?pretty=true
{"size":5,
"query": {
"function_score": {
"query": {
"bool":{
"must": {
"term":
{"category_id": "5df3ab90-6e93-0133-7197-04383561729e"}
}
}
},
"functions":
[{"random_score":{}}]
}
},
"sort": [{"_score":{"order":"desc"}}]
}
Devuelve 5 elementos de la categoría seleccionada, al azar. Cada artículo tiene un campoweight
. Entonces, probablemente tenga que usar
"script_score": {
"script": "weight = data['weight'].value / SUM; if (_score.doubleValue() > weight) {return 1;} else {return 0;}"
}
tal como se describeaquí.
Tengo los siguientes problemas:
¿Cuál es la forma correcta de hacer esto?¿Necesito habilitarScripting Dinámico?¿Cómo calcular la suma total de la consulta?¡Muchas gracias por tu ayuda!