Buscador de vídeos con OpenSearch y React | Parte 1 | Introducción
Tags: tutorial, go, python, react
Published: 2022-11-18 14:02:40

**⚠️ Nota:** La idea original de este proyecto surgió gracias al canal **Soumil Shah**, por lo que doy crédito y recomiendo ver su serie de vídeos sobre Elastic Search [Aquí](https://www.youtube.com/watch?v=obTK8dAaOkc).

El repositorio con el resultado final puede ser consultado en [Github](https://github.com/PChaparro/search-engine).

## Índice

1. Post 1 - Introducción: [Aquí](https://dev.to/pedrochaparro/buscador-de-videos-con-opensearch-y-react-parte-1-introduccion-4gfd)
2. Post 2 - Recolección de los datos: [Aquí](https://dev.to/pedrochaparro/buscador-de-videos-con-opensearch-y-react-parte-2-recoleccion-de-datos-5b6l)
3. Post 3 - Limpieza y almacenamiento de los datos: [Aquí](https://dev.to/pedrochaparro/buscador-de-videos-con-opensearch-y-react-parte-3-limpieza-y-almacenamiento-de-los-datos-5e21)
4. Post 4 - Desarrollo de la API (🚧 Trabajando en ello...) 
5. Post 5 - Desarrollo del cliente Web (🚧 Trabajando en ello...) 

## Introducción

A través de los diferentes posts vamos a desarrollar un sitio web full-stack que nos permitirá **buscar vídeos de una manera rápida y obtener resultados coherentes con el texto ingresado**. En la siguiente imagen se puede ver el resultado final del front-end funcional:  

![Resultado final](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n0dka5hungdy60ymukwd.png)

## Stack tecnológico

A continuación se presenta el listado de los lenguajes de programación y herramientas que usaremos en los diferentes pots: 

**⚠️ Nota:** Las definiciones se presentan de manera sencilla, con el fin de facilitar el entendimiento del proyecto a realizar, para más información recomiendo ver los sitios web / documentación oficial de los lenguajes / herramientas.

1. **Go / Golang**: Mediante este lenguaje de programación haremos uso del paquete [youtubescraper](https://pkg.go.dev/github.com/PChaparro/go-youtube-scraper) para obtener la url, miniatura, título, descripción y tags de vídeos publicados en la plataforma Youtube.

2. **Python**: Este lenguaje será utilizado para hacer una limpieza sencilla de los datos, insertar los datos en _open search_ y desarrollar los _endpoints_ de la API que será consultada por el front-end.

3. **Open search**: Es el motor de búsquedas y análisis que nos permitirá **almacenar los datos y realizar búsquedas semánticas**, lo cual se explicará más adelante. [Más información](https://opensearch.org/versions/opensearch-2-3-0.html).

4. **Sentence transformers**: Este paquete de python nos permitirá **transformar los vídeos y las búsquedas en vectores**, los cuales serán usados para encontrar vídeos similares semánticamente a las búsquedas realizadas por los usuarios. [Más información](https://pypi.org/project/sentence-transformers/).

5. **React:** Es la librería que utilizaremos para el desarrollo del _front-end_, lo que nos permitirá dividir responsabilidades entre componentes.

## ¿Por qué vamos a utilizar Open Search y Sentence Transformers? 

La funcionalidad más importante del sitio web a desarrollar es la búsqueda de vídeos a partir de textos. Si bien, podríamos utilizar cualquier otra base de datos como Postgres o MongoDB para almacenar los datos y buscar el texto ingresado por el usuario en el título, descripción y tags de los diferentes vídeos para obtener los resultados, esto podría no arrojar resultados precisos en muchos escenarios, como en los siguientes dos ejemplos: 

1. **Un error de digitación:** En caso de hacer una búsqueda exacta del texto ingresado por el usuario, una frase con un error como "_Crate web sites_" (Falta la **e** en _Create_) podría no obtener resultados a pesar de que en la base de datos existan cientos o miles de registros con la frase "_Create web sites_".

2. **Una búsqueda por significado:** Un usuario podría realizar una búsqueda como "_I don´t know which new video game i should buy_", claramente, podemos inferir que lo que desea encontrar son recomendaciones de videojuegos, pero una base de datos "convencional" podría no encontrar resultados para su búsqueda debido a que **no hay textos similares en los títulos, descripciones o tags de ningún vídeo**.

Como los dos ejemplos anteriores, existen muchos más, por ejemplo, las búsquedas en diferentes lenguajes. Como solución, la "libería" _sentence transformers_ ofrece diferentes modelos de inteligencia artificial entrenados con **millones o billones** de datos para extraer los significados de textos a un vector de longitud fija y que, según el modelo escogido, pueden soportar **más de 50 lenguajes diferentes**. [Más información](https://www.sbert.net/docs/pretrained_models.html).

A partir del vector generado por _sentence transformers_ se pueden aplicar algoritmos como el [coseno de similitud](https://en.wikipedia.org/wiki/Cosine_similarity) o [K-NN](https://www.ibm.com/topics/knn) que permiten encontrar vectores similares, y, por tanto, **vídeos similares a la semántica / "significado" del texto ingresado**. Es justo aquí donde _Open Search_ ofrece una gran ventaja, ya que cuenta con un [plugin del algoritmo K-NN ](https://opensearch.org/docs/latest/search-plugins/knn/index/) que nos permitirá realizar búsquedas rápidas y acertadas de manera sencilla. 

## Final

Con esto se concluye esta primer parte, que solamente sirve como contextualización, te invito a continuar con la siguiente.

## Referencias

Para consultar las referencias dirigirse a cada uno de los enlaces que aparencen dentro o al final de los diferentes párrafos.