Семантический поиск — это способ улучшить качество и релевантность результатов поиска за счет понимания смысла и намерений пользовательских запросов, а также контекста и взаимосвязей терминов в доступных для поиска данных. Семантический поиск может предоставлять более точные и персонализированные результаты, а также описания, выделения и ответы, которые обобщают содержимое и отвечают на вопросы пользователей.
MongoDB Atlas — это служба облачной базы данных, которая предоставляет разработчикам многооблачную платформу данных для создания приложений с помощью MongoDB. MongoDB Atlas предлагает возможности семантического поиска, которые могут помочь вам создать богатые и привлекательные возможности поиска для ваших пользователей. В этой статье я покажу вам, как включить семантический поиск в вашем сервисе MongoDB Atlas и как использовать его в вашем приложении JavaScript.

Включить семантический поиск в MongoDB Atlas
Чтобы использовать семантический поиск в MongoDB Atlas, у вас должна быть учетная запись и кластер MongoDB Atlas, работающий в одном из поддерживаемых регионов и уровней служб. Вы можете зарегистрировать бесплатную учетную запись и создать бесплатный кластер на MongoDB Atlas здесь.
Когда у вас есть кластер, вы должны включить семантический поиск для своих служб. Вы можете сделать это, выполнив следующие действия:
- Откройте представление «Кластеры» в пользовательском интерфейсе Atlas.
- Щелкните значок с многоточием (…) рядом с именем вашего кластера и выберите «Изменить конфигурации».
- На вкладке «Уровень кластера» прокрутите вниз до раздела «Дополнительные настройки» и установите переключатель «Семантический поиск» в положение «Вкл.».
- Нажмите «Просмотреть изменения», а затем «Применить изменения», чтобы сохранить конфигурацию.
После включения семантического поиска вам необходимо создать коллекции и проиндексировать ваши данные. Вы можете использовать любой источник данных, который содержит текстовые данные, такие как документы, статьи, обзоры и т. д. В этом примере используется пример набора данных обзора фильмов, который вы можете загрузить в свой кластер из пользовательского интерфейса Atlas. Чтобы загрузить образец набора данных, выполните следующие действия:
- Откройте представление «Кластеры» в пользовательском интерфейсе Atlas.
- Щелкните значок с многоточием (…) рядом с именем вашего кластера и выберите Загрузить образец набора данных.
- Дождитесь окончания процесса загрузки. Вы увидите подтверждающее сообщение о том, что «Демонстрационные данные загружены в ваш кластер».
- Щелкните Коллекции, чтобы увидеть коллекцию образцов, загруженных в ваш кластер. Вы увидите коллекцию с именем sample_mflix.reviews, которая содержит обзоры фильмов.
Чтобы проиндексировать данные для семантического поиска, необходимо создать текстовый индекс для полей, содержащих текстовые данные. Вы можете сделать это, выполнив следующие действия:
- Откройте представление «Коллекции» в пользовательском интерфейсе Atlas.
- Щелкните базу данных sample_mflix и просмотрите коллекцию.
- Перейдите на вкладку «Индекс», затем нажмите «Создать индекс».
- В разделе «Добавить поле» выберите поля, которые вы хотите индексировать для семантического поиска. В этом примере выбираем Text и Summary в качестве наших текстовых полей.
- В разделе «Параметры» выберите «Текст» в качестве типа индекса и введите имя для вашего индекса. В этом примере имя индекса «textIndex».
- Нажмите «Создать указатель», чтобы создать указатель вашего текста.
Теперь вы включили семантический поиск в своей службе MongoDB Atlas и проиндексировали свои данные для семантического поиска. Вы можете протестировать возможности семантического поиска с помощью пользовательского интерфейса Atlas Search или API Atlas. В этом примере мы используем пользовательский интерфейс Atlas Search для выполнения некоторых семантических запросов к нашей коллекции обзоров фильмов.
Используйте семантический поиск в своем приложении JavaScript
Чтобы использовать семантический поиск в вашем приложении JavaScript, вам необходимо подключиться к кластеру MongoDB Atlas с помощью одного из поддерживаемых драйверов или фреймворков. В этом примере используются Node.js и Mongoose в качестве драйверов и фреймворков. Вы можете установить Node.js отсюда, Mongoose отсюда.
Чтобы подключиться к кластеру MongoDB Atlas с помощью Node.js и Mongoose, необходимо подготовить строку подключения. Вы можете получить строку подключения из пользовательского интерфейса Atlas, выполнив следующие действия:
- Откройте представление «Кластеры» в пользовательском интерфейсе Atlas.
- Щелкните Подключиться рядом с именем вашего кластера.
- Выберите Подключить приложение в качестве метода подключения.
- Выберите Node.js в качестве драйвера и выберите последнюю версию в качестве версии.
- Скопируйте отображаемую строку подключения.
Вам также необходимо заменить ‹password› на свой пароль и ‹dbname› на имя вашей базы данных в строке подключения.
После настройки строки подключения вы можете создать файл Node.js с именем app.js и вставить следующий код:
// Import mongoose
const mongoose = require(‘mongoose’);
// Define schema for movie reviews
const reviewSchema = new mongoose.Schema({ _id: mongoose.Schema.Types.ObjectId, date: Date, movie_id: mongoose.Schema.Types.ObjectId, reviewer_id: mongoose.Schema.Types.ObjectId, text: String, rating: Number, summary: String });
// Create model for movie reviews
const Review = mongoose.model(‘Review’, reviewSchema);
// Connect to MongoDB Atlas cluster
mongoose.connect(‘<your connection string>’, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => { console.log(‘Connected to MongoDB Atlas’); // Perform semantic queries here }) .catch(err => { console.error(err); });
В приведенном выше коде мы импортируем mongoose, определяем схему и модель для нашей коллекции обзоров фильмов и подключаемся к нашему кластеру MongoDB Atlas, используя нашу строку подключения. Вы можете заменить ‹вашу строку подключения› фактической строкой подключения.
Чтобы выполнить семантический запрос к нашей коллекции обзоров фильмов, мы можем использовать метод find нашей модели и передать объект запроса, содержащий параметр семантического поиска. Параметры семантического поиска:
- $search: указывает, что запрос должен использовать оператор Atlas Search.
- index: указывает имя текстового индекса для использования в запросе. Оно должно совпадать с именем индекса, которое мы создали ранее.
- text: определяет параметр текстового запроса, например:
query: определяет строку запроса пользователя.
path: указывает поле для поиска. Оно должно совпадать с полем, которое мы проиндексировали ранее.
нечеткое: указывает, следует ли включить нечеткое сопоставление, которое допускает орфографические ошибки и опечатки в запросе.
оценка: определяет, как вычислить показатель релевантности для каждого документа. Оно может быть простым или смысловым. Для семантического поиска мы должны использовать семантику в качестве типа оценки.
Например, чтобы выполнить семантический запрос для поиска обзоров фильмов, в которых упоминаются «боевик» и «приключение», мы могли бы использовать следующий код:
// Perform a semantic query that looks for movie reviews that mention “action” and “adventure”
Review.find({ $search: { index: ‘textIndex’, text: { query: ‘action adventure’, path: [‘text’, ‘summary’], fuzzy: true, score: { type: ‘semantic’ } } } }) .then(results => {
// Print the results
console.log(results); }) .catch(err => { console.error(err); });
Приведенный выше код вернет массив документов, соответствующих семантическому запросу, отсортированных по степени релевантности. Каждый документ также будет иметь поле _score, указывающее, насколько он релевантен запросу.
Чтобы получить описание и основные моменты для каждого документа, мы можем использовать оператор $project в нашем объекте запроса и указать поля, которые мы хотим вернуть. Мы также можем использовать оператор $meta для доступа к метаданным семантического поиска, например:
- описание: возвращает предложение или фразу, которая лучше всего резюмирует содержание документа.
- highlight: возвращает массив объектов, содержащий выделенный текст и путь к нему.
Например, чтобы получить описание и основные моменты для каждого документа в предыдущем запросе, мы могли бы использовать следующий код:
// Perform a semantic query that looks for movie reviews that mention “action” and “adventure” and get captions and highlights
Review.find({ $search: { index: ‘textIndex’, text: { query: ‘action adventure’, path: [‘text’, ‘summary’], fuzzy: true, score: { type: ‘semantic’ } } } }, { $project: { _id: 1, date: 1, movie_id: 1, reviewer_id: 1, rating: 1, caption: { $meta: ‘caption’ }, highlights: { $meta: ‘highlights’ } } }) .then(results => { // Print the results console.log(results); }) .catch(err => { console.error(err); });
Приведенный выше код вернет массив документов, соответствующих семантическому запросу, отсортированных по степени релевантности. Каждый документ также будет иметь поле описания, содержащее сводку содержимого документа, и поле выделения, содержащее массив выделенного текста и путь к нему.
Чтобы получить ответ для каждого документа, мы можем использовать параметр ответа в нашем объекте текстового запроса и установить для него значение true. Это вернет поле ответа в каждом документе, которое содержит прямой ответ на запрос, если таковой имеется. Столбец ответов также будет иметь показатель доверия, указывающий, насколько семантическая поисковая система уверена в ответе.
Например, чтобы получить ответы для каждого документа в нашем предыдущем запросе, мы могли бы использовать следующий код:
// Perform a semantic query that looks for movie reviews that mention “action” and “adventure” and get answers
Review.find({ $search: { index: ‘textIndex’, text: { query: ‘action adventure’, path: [‘text’, ‘summary’], fuzzy: true, score: { type: ‘semantic’ }, answer: true } } }, { $project: { _id: 1, date: 1, movie_id: 1, reviewer_id: 1, rating: 1, caption: { $meta: ‘caption’ }, highlights: { $meta: ‘highlights’ }, answer: { $meta: ‘answer’ } } }) .then(results => { // Print the results console.log(results); }) .catch(err => { console.error(err); });
Этот код вернет массив документов, соответствующих семантическому запросу, упорядоченных по их оценке релевантности. Каждый документ также будет иметь поле описания, содержащее сводку содержимого документа, поле выделения, содержащее массив выделенного текста и его путь, и поле ответа, содержащее прямой ответ на запрос, если таковой имеется.
Например, один из документов, которые может вернуть этот запрос:
{ “_id”: “5a9427648b0beebeb6957e48”, “date”: “2018–02–26T04:00:00.000Z”, “movie_id”: “573a13eff29313caabdd82f3”, “reviewer_id”: “5a9427648b0beebeb6957e47”, “rating”: 4, “caption”: “A fun and thrilling action adventure movie with great characters and humor.”, “highlights”: [ { “text”: “I really enjoyed this movie. It was a fun and thrilling action adventure with great characters and humor.”, “path”: “text” }, { “text”: “The action scenes were well done and exciting, and the adventure aspect was engaging and unpredictable.”, “path”: “text” } ], “answer”: { “value”: “Yes, this movie is an action adventure.”, “confidence”: 0.9 } }
Как видите, этот документ имеет высокий показатель релевантности, описание, обобщающее содержание, выделение с указанием соответствующих терминов и ответы, непосредственно отвечающие на вопрос.
Показывает, как включить семантический поиск в службе MongoDB Atlas и как использовать его в приложении JavaScript. Семантический поиск может помочь вам создать богатые и привлекательные возможности поиска для пользователей, предоставляя более точные и персонализированные результаты, а также текст, выделение и ответы, которые суммируют содержимое и отвечают на вопросы пользователей.
В этой статье также показано, как использовать пользовательский интерфейс Atlas Search и API Atlas для проверки возможностей семантического поиска, а также как использовать текстовый индекс, оператор $search, оператор $project и оператор $meta для выполнения семантического поиска. вопросы о вашей коллекции рецензий на фильмы.
Спасибо, что дочитали до конца. Пожалуйста, следите за автором и этой публикацией. Посетите Stackademic, чтобы узнать больше о том, как мы демократизируем бесплатное обучение программированию по всему миру.