MongoDb: найти документы, содержащие теги/ключевые слова, соответствующие заданной строке

у меня есть коллекция (Foo), в которой есть поле «ключевые слова». Я хочу найти документы, которые соответствуют заданной строке (имеют хотя бы одно подходящее ключевое слово), и отсортировать их по количеству совпадений.

Foo:
{name: 'Foo1', keywords: ['example', 'sample', 'keywords']},
{name: 'Foo2', keywords: ['keywords example', 'find']},
{name: 'Foo3', keywords: ['search']},
{name: 'Foo4', keywords: ['example keywords', 'find', 'example', 'search']}

Таким образом, для строки "This is example keywords search" должны возвращаться документы в следующем порядке:

  1. Foo4 (3 совпадения — «пример ключевых слов», «пример», «поиск»)
  2. Foo1 (2 совпадения — «пример», «ключевые слова»)
  3. Foo3 (1 совпадение — «поиск»)

Я использую Symfony3 и DoctrineODM, если это имеет значение. Всем спасибо за помощь!


person Sycu    schedule 02.08.2017    source источник
comment
@Severin, я не понимаю, чем ваша ссылка похожа на мой вопрос, так как у меня есть строка в качестве входных данных, которую нельзя просто разбить на отдельные слова.   -  person Sycu    schedule 02.08.2017
comment
Вы пробовали что-нибудь или просто бросали задачу на SO, надеясь, что кто-то ее решит?   -  person malarzm    schedule 02.08.2017
comment
@malarzm я пробовал что-то вроде {$where: \This is example keywords search\.match(this.keywords)} , но это вообще не работает - возвращает документы с пустым массивом ключевых слов, независимо от того, какую строку я использую. У меня больше нет идей, как это можно решить, поэтому и спрашиваю здесь   -  person Sycu    schedule 02.08.2017
comment
Вы можете попробовать разбить строку ключевого слова на массив ключевых слов и сравнить этот массив с ключевыми словами в документе, чтобы подсчитать количество совпадений и отсортировать документы по количеству совпадений внутри конвейера агрегации.   -  person s7vr    schedule 03.08.2017


Ответы (1)


MongoDB поддерживает подсчет совпадений для каждого документа, и вы даже можете создать текстовый индекс, который наблюдает за несколькими полями с пользовательскими весами. (Полезно даже отказаться от любого автоматического определения ключевых слов, которое вы бы создали для других БД.)

person Levente Pánczél    schedule 26.10.2017