Orden random por campo personalizado


(leandro) #1

Hola, tengo un campo personalizado llamado scores, que computa la cantiad de items vendidos en una cantidad de tiempo determinada. Necesito hacer una busqueda y que los resultados esten en orden aleatorio teniendo en cuenta ese campo.

Como puedo hacerlo??

Muchas gracias!!

{
"_index": "books_ar",
"_type": "item",
"_id": "1226148",
"_score": null,
"_source": {
"catalogitem_id": "1226148",
"scores": {
"lifetime": "209",
"onemonth": "0.00008805",
"threemonths": "0.00039814",
"sixmonths": "0.00039814",
"oneweek": "0.00001148"
},
"genre_id": "676",
"price": "153.99",
"currency": "ARS"
}
}


(Ismael Hasan Romero) #2

Hola Leandro!

No tengo claro el requisito:

Usando sort puedes decidir qué campo usar para ordenar los resultados (incluso puedes hacer tu propio script de ordenación - cuidado! Si haces tu propio script deberías de testearlo para comprobar que no afecta al rendimiento).

Lo que me descoloca es que los scores sean un objecto, y lo que comentas de que el orden sea aleatorio. Puedes elaborar un poco más en el requisito que tienes?

Un saludo!


(leandro) #4

Hola Ismael gracias por responder. Los scores son un objeto por que podes pedir los items mas vendidos del ultimo mes, 3 o 6 meses. Entonces decidimos que sea un objeto. Lo que pasa es que no todos lo items tiene scores. Si un item nunca fue vendido, no tiene scores.

Ahora bien, lo que necesito es obtener 50 resultados, que si tengan scores, pero en modo random. Osea de los que tiene scores que venga el item 5,2,1,4,3. La segunda consulta me va a traer el 4,1,5,3,2. Los resultados en modo random.

Se entiende?

Muchas gracias!


(Ismael Hasan Romero) #5

Entendido Leandro! En Elasticsearch puedes crear random_scores . Si encapsulas tu query en un function score random, deberías de tener el efecto que quieres.

Aparte, entiendo que sólo quieres documents que tengan un score interno, correcto? En ese caso, puede usar la query exists que te permite recuperar documents que contienen un campo específico.

Combinando las dos anteriores tendrías un score random, devolviendo sólo documents que tienen un score interno.

Un saludo!


(leandro) #6

Hola Ismael, lo estoy intentando pero no logro dar con un resultado random. Siempre me devuelven los mismos items.

En dónde estoy fallando?

Gracias!

{
 "query": {
    "function_score": {
    	"random_score": {
            "seed": 10
        },
        "query": {
            "bool": {
                "should": [
                    { "term": {"categories.category.id": "322"} }
                ]
            }
        }
    }
},
"size": 100

}


(Ismael Hasan Romero) #7

Hola Leandro,

la razón es que estás dando un seed a la función de random_score: el seed se usa para que los resultados sean repetibles (i.e, genera una lista aleatoria utilizando ese seed, y el mismo seed siempre genera la misma lista). Si no añades ese parámetro, internamente usará un seed diferente en cada ocasión, lo que lleva a que los resultados sean ordenados de forma diferente en cada ejecución de la consulta.

Un saludo!


(system) #8

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.