Лучший способ выполнить полный текстовый поиск в MongoDB и Mongoose
Я ищу Google в течение нескольких дней, и я пробовал много вещей, но я все еще не могу выполнить хороший полнотекстовый поиск в своей пользовательской коллекции.
Я попробовал ElasticSearch, но было невозможно запросить и разбивать страницы...
Я пробовал много плагинов для Mongoose, таких как ElMongo, mongoose-full-text, Mongoosastic и т.д.... все очень плохо документированы, и я не знаю, как выполнить хороший полнотекстовый поиск.
Итак, моя коллекция является обычной коллекцией:
user = {
name: String,
email: String,
profile: {
something: String,
somethingElse: String
}
}
У меня есть вход для поиска на странице с простым POST
, если я набираю hello world
, мне нужно искать по всем полям коллекции соответствующие слова моего поискового запроса и получать результаты.
Будет очень хорошо также иметь опции для обработки разбиения на страницы, как 10 элементов на страницу или что-то в этом роде.
Какое наилучшее решение для этого? Я использую MongoDB 2.6. * С Mongoose, NodeJS и ExpressJS.
Спасибо.
Ответы
Ответ 1
Вы можете добавить текстовый индекс в свое определение схемы Mongoose, которое позволяет использовать $text
в ваших запросах find
для поиска всех полей, включенных в текстовый индекс.
Чтобы создать индекс для поддержки текстового поиска, например, name
и profile.something
:
var schema = new Schema({
name: String,
email: String,
profile: {
something: String,
somethingElse: String
}
});
schema.index({name: 'text', 'profile.something': 'text'});
Или, если вы хотите включить все строковые поля в индекс, используйте подстановочный символ '$**'
:
schema.index({'$**': 'text'});
Это позволит вам выполнить поисковый запрос с текстовым поиском, например:
MyModel.find({$text: {$search: searchString}})
.skip(20)
.limit(10)
.exec(function(err, docs) { ... });
Ответ 2
В поисковом запросе вы можете использовать плагин Elasticsearch. В Elasticsearch вы можете создать свой собственный пользовательский поисковый запрос для поиска любого конкретного текста и строки с указанной продолжительностью времени в реальном времени.
Но перед этим вам нужно сделать индексацию ваших json-документов, находящихся в MongoDB. Вам необходимо подключить MongoDB с сервером Elasticsearch. Затем, используя речную функциональность Elasticsearch, вы должны сделать индексирование на сервере Elasticsearch своих данных, тогда вы можете сделать свой собственный запрос для поиска.