¿Cómo implementaría un índice de búsqueda de texto completo liviano pero escalable en Javascript que solo cargaría índices a través de archivos estáticos accesibles a través de http?
Tenga en cuenta que no estoy buscando un motor de búsqueda de Javascript, como Lunr.js, que cargue un solo archivo de índice, ya que no se escala.
Tengo alrededor de 100 000 documentos que quiero que se puedan buscar en línea, pero tengo muy poco dinero para gastar en alojar un motor de búsqueda de texto completo (por ejemplo, Elasticsearch). Los documentos no necesariamente pueden ser públicos, por lo que la indexación a través de Google y otros motores de búsqueda públicos no es viable y, por supuesto, un servidor de búsqueda de Google privado pagado también tiene un costo prohibitivo. Sin embargo, puedo alojar de forma económica una tonelada de JSON y otros archivos de texto simples. Así que me gustaría implementar un motor de búsqueda muy rudimentario usando eso. No estoy buscando implementar un lenguaje de consulta complejo. Solo búsquedas simples de palabras clave.
Mi enfoque ingenuo es analizar todos los documentos y crear una bolsa de palabras para cada archivo. Luego, para cada palabra única, genere un archivo de índice que represente un almacén de clave/valor, enumerando el ID de cada documento que usa esa palabra, junto con un recuento de cuántas veces aparece la palabra en el documento.
Luego, puedo implementar una búsqueda simple de Javascript o Python tomando la consulta de búsqueda de un usuario, iterando sobre cada término de búsqueda, recuperando el archivo de índice para cada término y encontrando la identificación del documento que tiene la mayor cantidad de conteos para cada término.
Algo como:
def get_search_results(user_query, limit=10): results = {} # {doc_id: score} for term in user_query: index_data = retrieve_index(term) for doc_id, term_count in index_data.items(): results[doc_id] += term_count results = sorted(results.items(), lambda o: o[1], reverse=True)[:limit] return resultsObviamente, este es un enfoque muy ingenuo y no es terriblemente eficiente. Si bien es muy económico alojarlo, incluso para mi cantidad relativamente pequeña de documentos, cada archivo de índice es enorme y el script tarda un tiempo en analizarlo y agregarlo.
Sin embargo, tengo que creer que alguien ha encontrado este problema antes. Sin embargo, no puedo encontrar nada cuando busco este tipo de motor de búsqueda del lado del cliente utilizando archivos de índice estático del lado del servidor. Las únicas soluciones que encuentro son:
Ninguna de estas soluciones es rentable.
¿Hay alguna forma mejor de estructurar mis archivos de índice, o existe una herramienta o enfoque existente que hace este tipo de búsqueda de manera más eficiente?
Use una bifurcación SQL.js con un sistema de archivos virtual que admita solicitudes de rango para que solo lea de manera eficiente las páginas del sistema de archivos a pedido. Vea los enlaces a continuación.
También tengo un gran catálogo que me gusta hacer que se pueda buscar sin el uso de un servidor de consultas (proyecto web3). Actualmente estoy usando https://github.com/rhashimoto/wa-sqlite (con un sistema de archivos virtual personalizado que admite cualquier servidor que admita solicitudes de rango) para alojar el archivo sqlite grande en Sia Skynet.
Todavía estoy interesado en una posible solución de texto sin formato en la que solo el índice al índice se entrega al cliente de la manera más eficiente posible. Dado suficiente espacio de alojamiento estático, esto debe ser posible. Sin embargo, probablemente no valdrá la pena construir considerando que SQL.js + HTTP VFS ya es tan razonablemente eficiente con algunos buenos índices.
Menciones de honor que podrían tener un HTTP VFS incorporado: