MongoDB + Node.js + AJAX решение для автозаполнения поиска - PullRequest
8 голосов
/ 28 января 2012

Я ищу реализацию поиска по типу заголовка / автозаполнения для развлечения. У меня есть несколько атрибутов в моей схеме в mongoDB, но я хочу иметь возможность поиска только по категории, названию, предварительному просмотру или дате.

Это моя схема mongoDB для одной статьи (я использую mongoose в качестве ORM):

{
    title: { type: String, required: true}
    , preview: { type: String, required: true}
    , body: { type: String, required: true}
    , category: {type: String}
    , created_at: { type: Date, default: Date.now }
}

Каждый раз, когда я создаю, обновляю или уничтожаю, мне приходится переиндексировать, чтобы поиск обновлялся. Поиск будет автоматически завершен, так что, например, когда у меня есть две статьи под названием «Добро пожаловать в stackoverflow» и «Как избежать stackoverflow» соответственно, и пользователь вводит ключ 't', тогда я бы отображал обе статьи, используя AJAX, так как оба имеют символ 't' в своих заголовках. Я также хотел бы выделить каждый 't'; 't' в 'to', 't' в s 't' ackoverflow, указывающий, что запрос что-то достигает. (Я ожидаю, что это будет выглядеть примерно так, когда мы будем искать конкретные «теги» здесь на stackoverflow.com)

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

  • Атрибуты заголовка, вероятно, имеют в среднем только ~ 45 символов и 3 или 4 слова.
  • Категория в основном только 1 слово, в среднем 9-15 символов.
  • Предварительный просмотр - это самые большие наборы данных с ~ 150 символами и 20 словами в среднем.

Я бы, вероятно, хотел бы реализовать это с использованием трех структур данных. Вдобавок ко всему, я бы сказал, что один из способов сделать это - заставить AJAX запрашивать каждое нажатие клавиши, которое будет перенаправлено на обработчик node.js, а затем оттуда делать запрос к mongoDB, который будет возвращать каждую запись, содержащую слова, которые имеет букву, которая соответствует нажатию клавиши, введенной пользователем в виде файла JSON. Затем я проанализирую этот файл JSON и покажу каждую запись.

Тогда возникает вопрос, как бы я вписал алгоритм три в свой план? Другое дело, что мне нужно перестраивать индекс каждый раз, когда я выполняю операцию CRUD.

Буду признателен за любые предложения / указатели в правильном направлении или любые статьи, которые помогут мне сделать это. (Я ищу лучший способ / исполнительский способ) Спасибо. Дайте мне знать, если вопрос требует уточнения.

1 Ответ

8 голосов
/ 04 февраля 2012

Я не думаю, что три будет работать. Три обычно работают с начала строки. Таким образом, если вы используете три для индексации заголовков, пользователь, набравший 't', сможет искать только три заголовка, которые начинаются с t. Я думаю, что лучшим вариантом для использования mongodb, если у вас нет большого количества текста, является простое использование регулярных выражений в сочетании с оператором $ или.

В случае события изменения в текстовом поле вы, как вы сказали, захотите сделать AJAX-запрос на ваш сервер узлов, который выдаст запрос к mongodb и вернет результаты в массиве JSON.

Регулярные выражения в монго: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions

$ или оператор: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

Демонстрация того, как jQuery UI обрабатывает автозаполнение (для справки по запросу AJAX и заполнения значений): http://jqueryui.com/demos/autocomplete/

...