Una implementación simple del motor de búsqueda.
Propósitos de estudio, principalmente para comprender los detalles de implementación de cómo se crean los motores de búsqueda, las compensaciones de rendimiento y la estructura.
La idea es realizar una aplicación isomórfica desde la interfaz de usuario al sistema de base de datos.
La aplicación se puede implementar mediante Docker o el binario publicado en github.
./searchzin -c <path-to-config>.yml
Después de eso, puede buscar en http://localhost:8080
para ver la página de búsqueda.
La configuración se puede realizar mediante el archivo de configuración ubicado de forma predeterminada en /etc/searchzin/config.yml
o proporcionando claves de configuración en el formato -C key=value
; el segundo formulario anula el primero.
Valores de configuración predeterminados:
port : 8080 # Service port
path :
log : /var/log/searchzin # Log directory
data : /var/lib/searchzin # Data directory
Toda la estructura del proyecto está realizada en golang, utilizando el framework gin
.
Las dependencias se gestionan mediante dep
.
La mayor parte de la cadena de herramientas del proyecto es administrada por Makefile
, los objetivos importantes son:
install
: instalar las dependencias necesarias y los ganchos de gitreadme
: Realiza la inclusión de archivos README.md
lint
: Realiza linting y formateo del código.test
: Bueno, compila y ejecuta pruebas unitarias.build
: Crea una carpeta distribuible linux
en dist
run
: ejecuta el código usando go run
run-dev
: crea y ejecuta un contenedor acoplablerelease
: crea una imagen acoplable de lanzamientopublish
: publica la imagen de la ventana acoplable en dockerhub utilizando el contenido del archivo VERSION
como versión.publish-latest
: publica la imagen de la ventana acoplable en dockerhub con la latest
etiquetawatch
: realiza lint
y test
en la modificación del archivofunc-test
: Realiza pruebas funcionales dentro de la carpeta de features
Hay 6 componentes principales de este motor de búsqueda:
Cada componente tiene una responsabilidad clara en el sistema, y todos trabajan en conjunto para responder a consultas y solicitudes de indexación de documentos.
Es responsable de almacenar y proporcionar identificaciones a los documentos recién creados. Las restricciones son:
id
.id
sin colisiones para la persistencia.ssd
o hdd
Almacena un índice inverso de "términos" y documentos.
terms
para documentar relaciones establecidas.key
para consultas con aproximación de palabras claveDado un nuevo documento, lo comprende y lo guarda tanto en la base de datos de índice como en la base de datos de documentos.
Analiza la entrada del usuario y la transforma en un plan de consulta utilizando una estructura de datos en forma de árbol.
lucene
.Dado un árbol de consultas, lo optimiza teniendo en cuenta las restricciones y el entorno en el que se ejecutará.
Después de tener un plan estructurado, la consulta recupera datos efectivos de la base de datos index
; este paso lo realiza el ejecutor.
Este lenguaje de consulta se basa en gran medida en el de lucene, para simplificar el diseño y comprender qué compensaciones se hicieron.
El escenario de prueba actual que se utilizará será la indexación de podcasts por nombre, contenido y etiquetas.
El uso base se puede encontrar en searchzin-example
.
searchzin está disponible bajo la licencia MIT.