Как работает текстовый поиск MongoDB $? - PullRequest
0 голосов
/ 06 декабря 2018

Я вставил следующие значения в свою коллекцию событий

db.events.insert(
   [
     { _id: 1, name: "Amusement Ride", description: "Fun" },
     { _id: 2, name: "Walk in Mangroves", description: "Adventure" },
     { _id: 3, name: "Walking in Cypress", description: "Adventure" },
     { _id: 4, name: "Trek at Tikona", description: "Adventure" },
     { _id: 5, name: "Trekking at Tikona", description: "Adventure" }
   ]
)

Я также создал индекс следующим образом:

db.events.createIndex( { name: "text" } )

Теперь, когда я выполняю следующий запрос (Поиск - Прогулка):

db.events.find({
    '$text': {
        '$search': 'Walk'
    },
})

Я получаю эти результаты:

{ _id: 2, name: "Walk in Mangroves", description: "Adventure" },
{ _id: 3, name: "Walking in Cypress", description: "Adventure" }

Но когда я ищу Trek:

db.events.find({
    '$text': {
        '$search': 'Trek'
    },
})

, я получаю только один результат:

{ _id: 4, name: "Trek at Tikona", description: "Adventure" }

Итак, мой вопрос: почему это не получилось:

{ _id: 4, name: "Trek at Tikona", description: "Adventure" },
{ _id: 5, name: "Trekking at Tikona", description: "Adventure" }

Когда я искал «Прогулку», он привел к документам, содержащим информацию как о прогулке, так и об прогулке.Но когда я искал Trek, он только приводил документ, в том числе Trek, где он должен был приводить и Trek, и Trekking

1 Ответ

0 голосов
/ 07 декабря 2018

В текстовом поиске MongoDB используется библиотека основы Snowball * для преобразования слов в ожидаемую корневую форму (или stem ) на основе общих языковых правил.Алгоритмическое основание обеспечивает быстрое сокращение, но у языков есть исключения (такие как нерегулярные или противоречивые шаблоны спряжения глаголов), которые могут повлиять на точность. Snowball введение включает в себя хороший обзор некоторых ограничений алгоритмического стемминга.

Ваш пример walking связан с walk и соответствует ожидаемому.

Однако ваш пример trekking связан с trekk, поэтому не соответствует вашему ключевому слову для поиска trek.

Вы можете подтвердить это, объяснив свой запрос и просмотрев информацию parsedTextQuery, в которой указаны используемые поисковые термины:

db.events.find({$text: {$search: 'Trekking'} }).explain().queryPlanner.winningPlan.parsedTextQuery
{
​   "terms" : [
​       "trekk"
​   ],
​   "negatedTerms" : [ ],
​   "phrases" : [ ],
​   "negatedPhrases" : [ ]
}

Вы также можете проверить ожидаемый выброс снежного кома, используя онлайн Snowball Demo или найдя библиотеку Snowball для вашего предпочтительного языка программирования.

Чтобы обойти исключения, которые обычно могут повлиять на ваш вариант использования, вы можете рассмотреть возможность добавления другого поля в ваш текстовый индекс с ключевыми словами для влияниярезультаты поиска.В этом примере вы бы добавили trek в качестве ключевого слова, чтобы событие, описанное как trekking, также соответствовало вашим результатам поиска.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...