Подобный подход был использован мной в моей задаче.
Я хотел выполнить какой-либо текстовый поиск и отобразить результаты перед пользователями в соответствии с релевантностью результата.
Раньше мы использовали для этого простое регулярное выражение Монго, но затем мы решили сделать то же самое с ElasticSearch.
Однако этот результат также основан на других факторах и атрибутах в моем случае (которые простонекоторые поля и пользовательские данные).
Вот мой подход (я объясню это на фиктивном примере).
Рассмотрим систему статей, где у пользователя есть свои собственные написанные статьи, онможет писать больше статей, если он хочет, чтобы они могли публиковать их, если они не опубликованы, они находятся в состоянии ПРОЕКТ, если активировано, тогда статья будет в состоянии АКТИВИРОВАН, и он может читать некоторые статьи, предоставленные владельцами системы. Также пользователь может поделитьсяего статьи с другими.
Таким образом, типичный дизайн БД будет выглядеть следующим образом:
{
articleType: Custom or System,
status: DRAFT, DEACTIVATED, ACTIVATED,
ownerId: unique id of the owner,
sharedWith: [unique ids of shared with users],
title: title of the article,
articleText: text description of the article,
tags: some tags related to article
}
и некоторые другие полезные поля.
По сути, при поиске статьи мы должныпокажите результат, если он является владельцем статьи, или он является общим с ним другим пользователем, или это системная статья, и эта системная статья находится в состоянии ACTIVATED на основе текста из тегов, описания, полей заголовка вdocument.
Итак, в соответствии с запросом mongo, я сначала экспортировал все необходимые поля в индекс ElasticSeach.
Затем я подготовил точно такой же запрос в ElasticSeach, когда мы выполняли поиск с помощьюзапрос монго.
т.е. мой запрос монго и запрос Elasticsearch были абсолютно одинаковыми.
Я удалил стоп-слова из текста поиска.
Я выполнил поиск в ElasticSearch только при наличии текста поиска, в противном случае я использовал только результаты монго.
здесь также реализована нумерация страниц.
Я создал текстовый индекс для коллекции mongo.
Стратегия такова: всякий раз, когда возникает ошибка из-за ElasticSeach или Cluster, возникает проблема тайм-аута. будет выполнять текстовый запрос на монго.
При использовании поиска статей с некоторым текстом, я выполнил поиск по ElasticSeach, также с помощью limit и skip, и получил _id и индекс каждого документа.
Когда я получил результат от ElastcSeach, я преобразовал _ids в ObjectId, у меня уже есть запрос монго, я добавил этот массив _ids (из ElasticSeach) в запрос, например:
{$and: [{_id: {$in : _idsFromES}} , ...remaining query]}
Я получаю точно такой же результатот Монго также,
Результаты слишком удовлетворительны и желательны для меня.
Кроме того, с этим я также обработал, удалить, вставить, обновление статьи,то же самое изменится и в ElasticSeach Index.
Таким образом, они всегда были в курсе.
Я надеюсь, что это поможет вам найти лучший способ выполнить вашу задачу. : -)