Mongodb примерное совпадение строк

Я пытаюсь внедрить поисковую систему для своего рецепта-сайта, используя mongo db. Я пытаюсь отобразить предложения поиска в окне виджетов для пользователей.

Я даже пытаюсь поддерживать неверные запросы (levenshtein distance).

Например: всякий раз, когда пользователи печатают "pza", тип-вперед должен отображать "пиццу" как одно из предложений.

Как реализовать такую ​​функциональность с помощью mongodb?

Обратите внимание, что поиск должен быть мгновенным, так как результат поиска будет получен с помощью виджета. Коллекции, над которыми я буду запускать поисковые запросы, имеют не более 1 миллиона записей.

Я думал о внедрении алгоритма расстояния levenshtein, но это замедляло бы производительность, поскольку коллекция огромна.

Я читал FTS (полнотекстовый поиск) в mongo 2.6 сейчас довольно стабилен, но мое требование - приблизительное совпадение, а не FTS. FTS не вернет "pza" для "пиццы".

Пожалуйста, рекомендуйте мне эффективный способ.

Я использую node собственный драйвер js mongodb.

Ответ 1

Функция текстового поиска в MongoDB (как в версии 2.6) не имеет встроенных функций для нечеткого/частичного соответствия строк. Как вы уже отметили, в данном случае основное внимание уделяется языковой поддержке и поддержке с базовыми булевыми операторами и сопоставлением слов/фраз.

Существует несколько возможных подходов к определению нечеткого соответствия в зависимости от ваших требований и того, как вы хотите квалифицировать "эффективные" (скорость, хранение, время разработки, требуемая инфраструктура и т.д.):

  • Внедрить поддержку нечеткого/частичного соответствия в вашей прикладной логике с использованием некоторых доступных алгоритмов звука и сходства. Преимущества этого подхода включают в себя необходимость не добавлять дополнительную инфраструктуру и быть в состоянии точно настроить соответствие вашим требованиям.

    Более подробные примеры см. в разделе Эффективные методы для нечеткого и частичного сопоставления в MongoDB.

  • Интеграция с внешним инструментом поиска, который обеспечивает более продвинутые функции поиска. Это добавляет некоторую сложность для вашего развертывания и, скорее всего, избыточно для типов, но вы можете найти другие функции поиска, которые вы хотели бы включить в другое место в своем приложении (например, "как это", "близость слова", грантовый поиск,..).

    Например, см. Как выполнить нечеткое сопоставление с Mongo Connector и Elastic Search. Примечание: ElasticSearch нечеткий запрос основан на расстоянии Левенштейна.

  • Используйте библиотеку автозаполнения, такую ​​как Twitter open source typeahead.js, которая включает в себя механизм предложений и API запросов/кеширования. Typeahead фактически дополняет любой из других подходов к бэкэнд, а его (необязательный) движок предложения Bloodhound поддерживает предварительную выборку, а также кэширование данных в локальных хранения.

Ответ 2

Лучшим случаем для него будет использование нечеткого запроса elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html

Он поддерживает алгоритм расстояния levenshtein из коробки и имеет дополнительные функции, которые могут быть полезны для ваших требований, а именно: - больше похоже на это - мощные грани/скопления - автозаполнение