El puntaje en Elasticsearch es un concepto clave que determina qué tan bien coincide un documento almacenado en un índice con la búsqueda que has realizado. Este puntaje es representado por un número, y entre más alto sea este número, mayor es la relevancia del documento con respecto a la búsqueda. Este proceso se utiliza para ordenar los documentos en función de su pertinencia.
¿Cómo funciona el algoritmo de puntuación?
El algoritmo de Elasticsearch verifica dos aspectos principales:
Número de ocurrencias del texto: Este factor examina cuántas veces aparece el término de búsqueda en los documentos.
Unicidad de las palabras: Evalúa qué tan única es una palabra en el contenido de los documentos dentro de un índice completo.
Por defecto, los documentos se ordenan utilizando este puntaje en las búsquedas realizadas, mostrando los documentos más relevantes en la parte superior de los resultados.
Ejemplo práctico: Uso de Postman con Elasticsearch
Para entender cómo se evalúa el puntaje en ElasticSearch, crearemos un conjunto de documentos de ejemplo.
¿Cómo agregar un documento en Elasticsearch?
Usaremos Postman para agregar un documento al índice de ejemplo. Creamos un nuevo plato:
PUT /platos/_doc/3{"nombre":"Nachos XL","descripcion":"Nachos con carne, guacamole, pico de gallo, salsa picante y queso.","estado":"activo","pedidos_ultima_hora":11,"ultima_modificacion":"2020-03-01","modificado_por":"jerry@gmail.com"}
El documento con ID = 3, denominado "Nachos XL", es agregado, y estamos listos para realizar una búsqueda con puntajes.
¿Cómo realizar búsquedas y evaluar el puntaje?
Búsqueda básica: Realizaremos una búsqueda sencilla con la cadena "nachos con queso":
GET /platos/_search
{"query":{"simple_query_string":{"query":"nachos con queso"}}}
Resultado: Se devuelven dos documentos, "Nachos XL" y "La Ensanadísima". "Nachos XL" tiene un puntaje más alto (3.014) al contener más coincidencias de las palabras clave.
Búsqueda alternativa: Cambiamos la búsqueda a "bowl de pollo saludable":
GET /platos/_search
{"query":{"simple_query_string":{"query":"bowl de pollo saludable"}}}
Resultado: Se devuelven "Bowl picante" y "La Ensanadísima", con puntajes más cercanos, reflejando una mayor proximidad en los términos buscados.
Ajuste de pesos en las búsquedas
Elasticsearch permite ajustar el peso de ciertos campos para influir en la relevancia de los resultados.
¿Cómo ajustar los pesos de los campos en una búsqueda?
Podemos asignar un peso mayor al campo de nombre:
GET /platos/_search
{"query":{"simple_query_string":{"query":"guacamole picante","fields":["nombre^2","descripcion"]}}}
Al asignar un peso mayor al campo "nombre", cambiamos la relevancia relativa de los documentos. Ahora "Bowl picante" puede obtener un puntaje más alto en contraste con una búsqueda inversa donde se le da más peso al "descripcion".
Implicaciones de ajustes en el puntaje
Al cambiar los pesos, observamos cómo el nombre impacta significativamente el resultado y cómo Elasticsearch permite moldear la relevancia en función de las necesidades de búsqueda específicas.
Cada ajuste puede modificar qué documento se considera más relevante, lo que demuestra la flexibilidad y el poder de Elasticsearch para personalizar los resultados de búsqueda. ¡Sigue explorando y experimentando con ElasticSearch para convertirte en un experto en gestión de búsquedas eficientes y efectivas!
El puntaje es el valor de coincidencia de un valor de búsqueda con los documentos almacenados en un índice de elaticsearch.
Mientras más valor de puntaje se tenga, más relevante es el documento.
El algoritmo verifica el # ocurrencias / unicidad de las palabras.
Las búsquedas son ordenadas por puntaje o relevancia del documento.
Para las búsquedas usamos GET /_search y "simple_query_string"
si se quiere buscar en ciertos atributos se agrega "fields", para agregar más peso sobre el campo se ^ + el valor del peso.
👍👍👍👍👍👍
Soy el único al que le dió hambre escuchando estos platos? jaja Ya regreso, iré a comprarme algo.
LOL
XD
Todos los "motores" estan basados en Apache Lucene, genial !
Apesar de que estoy trabajando con los mismos ejemplos, para el caso de la búsquedas 2 y 3, los resultados de la búsqueda no me coinciden con el orden de la información que muestra el instructor Kevin. ¿Es eso normal?
Estoy trabajando con las versiones:
elasticsearch.7.6.0
docker 20.10.2, build 2291f61
Muchas gracias.
Tienes la misma información cargada que el profesor? ahí puede estar el detalle.
Cambie los pesos, pero no mostró el registro de Nachos como el mas relevante con base en su score
{"took":16,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":{"value":2,"relation":"eq"},"max_score":1.6707861,"hits":[{"_index":"platos","_type":"_doc","_id":"1","_score":1.6707861,"_source":{"nombre":"Bowl Picante","descripion":"Pollo, Salsa picante, frijoles, platano y aguacate","estado":"activo","pedidosUltimaHora":42,"ultimaModificacion":{"usuario":"rick@mail.com","fecha":"2020-02-19"}}},{"_index":"platos","_type":"_doc","_id":"3","_score":1.1507283,"_source":{"nombre":"Nachos XL","descripion":"Nachos con carne, guacamole, pico de gallo, salsa picante y queso","estado":"activo","pedidosUltimaHora":11,"ultimaModificacion":{"usuario":"jerry@mail.com","fecha":"2020-03-01"}}}]}}
creo que en fields colocaste "descripion" en vez de "descripcion"
muy interesante este concepto del puntaje, buena explicación.
como hace para enviar el json en el body cuando hace una peticion HTTP GET?
Postman te deja, como si fue cualquier otro verbo. Si no te anda actualiza tu Postman
Hola Alex, es igual que hacer un Post, solo que cambias a Get.
=)
Saludos.
Esta búsqueda es case sensitive?
Que tan recomendable es basar un sistema de recomendación de documentos pdf utilizando este motor para buscar sobre el contenido de documentos pdf?
Supongamos documentos de 50 páginas, y el objetivo es recomendarle al usuario documentos de mayor relevancia con base en búsquedas textuales.
Que tan eficaz y escalable sería usar Elastic Search para este caso de uso?
¡Cómo le haces para buscar sin acento? En este caso ensaladisima, y que te traiga resultados. Si escribo "Ensaladísima" con acento, si me arroja algo.
seria cuestion de poner ~ para indicar que te busque las palabras similares, corrige incluso misstyping
Conclusión
El puntaje en Elasticsearch es dinámico y depende de la frecuencia, la unicidad y el contexto.
Puedes modular la relevancia ajustando el peso de los campos.
Usa el modo explicativo (explain: true) para entender a fondo cómo se rankean los resultados.
✅ Mejores prácticas al evaluar el puntaje
Usa explain=true en la URL para ver cómo se calculó el _score:
GET /platos/_search?explain=true
También puedes usar track_scores: true cuando estás ordenando por otros campos pero quieres ver los puntajes.
🧠 Factores que afectan el puntaje:
Frecuencia del término (TF - Term Frequency)
Cuántas veces aparece un término en el documento. Cuanto más frecuente, más importante parece ese documento para esa palabra.
Frecuencia inversa del documento (IDF - Inverse Document Frequency)
Qué tan rara es una palabra en todo el índice. Palabras raras (como “guacamole”) tienen más peso que comunes (como “con”).
Longitud del documento
Documentos más largos tienen una penalización proporcional para evitar que “sumen puntos” solo por tener más texto.
El puntaje (_score) es un valor numérico que indica qué tan relevante es un documento respecto a la consulta realizada. Por defecto, Elasticsearch usa el modelo BM25 (una evolución del clásico TF-IDF).
Busqueda con base en el puntaje y edicion de variable
busqueda con mayor puntaje
Busqueda con un termino de referencia: _search
Los pesos sobre los puntajes es como una especie de multiplicacion sobre el puntaje final.
Excelente!!
¡Cómo le haces para buscar sin acento? En este caso ensaladisima, y que te traiga resultados. Si escribo “Ensaladísima” con acento, si me trae datos
Esos significa que tienes ese campo tipo Keyword, osea, búsqueda exacta. Cámbialo a tipo Text