mongodb coincidencia aproximada de cadenas

Estoy tratando de implementar un motor de búsqueda para mi sitio web de recetas usando mongo db. Estoy tratando de mostrar las sugerencias de búsqueda en el cuadro de widget de escritura anticipada para los usuarios.

Incluso estoy tratando de soportar consultas mal deletreadas (distancia levenshtein).

Por ejemplo: siempre que los usuarios escriban ‘pza’, el tipo de escritura debe mostrar ‘pizza’ como una de las sugerencias.

¿Cómo puedo implementar dicha funcionalidad usando mongodb?

Tenga en cuenta que la búsqueda debe ser instantánea, ya que los resultados de la búsqueda se obtendrán mediante un widget de escritura anticipada. Las colecciones sobre las que ejecutaría consultas de búsqueda tienen como máximo 1 millón de entradas.

Pensé en implementar el algoritmo de distancia levenshtein, pero esto ralentizaría el rendimiento, ya que la recostackción es enorme.

Leí FTS (búsqueda de texto completo) en mongo 2.6 ahora es bastante estable, pero mi requisito es una aproximación aproximada, no FTS. FTS no devolverá ‘pza’ por ‘pizza’.

Por favor, recomiéndame la manera eficiente.

Estoy usando el controlador nativo node js mongodb.

La función de búsqueda de texto en MongoDB (como en 2.6) no tiene ninguna función incorporada para la coincidencia de cadenas parciales / difusas. Como ha señalado, el caso de uso actualmente se centra en el lenguaje y la compatibilidad con operadores booleanos básicos y la coincidencia de palabras y frases.

Hay varios enfoques posibles a considerar para la coincidencia aproximada según sus requisitos y cómo desea calificar “eficiente” (velocidad, almacenamiento, tiempo de desarrollador, infraestructura requerida, etc.):

  • Implemente el soporte para la coincidencia parcial / difusa en la lógica de su aplicación utilizando algunos de los algoritmos de similitud y sonido fácilmente disponibles. Los beneficios de este enfoque incluyen no tener que agregar ninguna infraestructura adicional y ser capaz de sintonizar de forma adecuada con sus requisitos.

    Para ver algunos ejemplos más detallados, consulte: Técnicas eficientes para la coincidencia aproximada y parcial en MongoDB .

  • Intégrese con una herramienta de búsqueda externa que proporciona funciones de búsqueda más avanzadas. Esto agrega un poco de complejidad a su implementación y es probable que sea excesivo solo por tipografía, pero puede encontrar otras funciones de búsqueda que le gustaría incorporar en otras partes de su aplicación (por ejemplo, “como esto”, proximidad de palabras, búsqueda facetada, …).

    Por ejemplo, consulte: Cómo realizar una comparación difusa con Mongo Connector y Elastic Search . Nota: la consulta difusa de ElasticSearch se basa en la distancia de Levenshtein.

  • Utilice una biblioteca autocompletada como el código abierto typeahead.js , que incluye un motor de sugerencias y una API de consulta / almacenamiento en caché. Typeahead es en realidad complementario a cualquiera de los otros enfoques de backend, y su motor de sugerencias (opcional) Bloodhound admite la captura previa y el almacenamiento en caché de datos en el almacenamiento local.

El mejor caso sería utilizar la consulta difusa de elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html

Es compatible con el algoritmo de distancia levenshtein y tiene características adicionales que pueden ser útiles para sus requisitos, por ejemplo: – más como esto – facetas / agregaciones poderosas – autocompletar