MongoDB полнотекстовый поиск - совпадающие слова и точные фразы

В настоящее время у меня есть некоторые проблемы с функцией полнотекстового поиска в MongoDB. Конкретно при попытке подбора точных фраз.

Я тестирую функциональность оболочки mongo, но в конечном итоге я буду использовать Spring Data MongoDB с Java.

Поэтому я сначала попытался запустить эту команду, чтобы найти слова "задержка", "поздно" и фразу "вовремя"

db.mycollection.find( { $text: { $search: "delay late \"on time\"" } }).explain(true);

И полученный запрос объяснения сказал мне:

"parsedTextQuery" : {
    "terms" : [
            "delay",
            "late",
            "time"
    ],
    "negatedTerms" : [ ],
    "phrases" : [
            "on time"
    ],
    "negatedPhrases" : [ ] },

Проблема в том, что я не хочу искать слово "время", а скорее фразу "вовремя". Я хочу искать отсрочку и опоздание и в идеале не хочу препятствовать этому.

Я пробовал несколько разных перестановок, например

db.mycollection.find( { $text: { $search: "delay late \"'on time'\"" } }).explain(true);

db.mycollection.find( { $text: { $search: "delay late \"on\" \"time\"" } }).explain(true);

Но, похоже, не мог получить правильные результаты. Я не вижу ничего очевидного в документации по этому поводу.

Для моих целей я должен использовать полнотекстовый поиск по отдельным словам и функцию регулярного поиска по фразам?

В данный момент работаю с MongoDB версии 2.6.5. Благодарю.

1 ответ

Вы пробовали текстовый поиск, чтобы увидеть, не ведет ли он себя правильно? Он работает, как и ожидалось для меня на MongoDB 2.6.7:

> db.test.drop()
> db.test.insert({ "t" : "I'm on time, not late or delayed" })
> db.test.insert({ "t" : "I'm either late or delayed" })
> db.test.insert({ "t" : "Time flies like a banana" })
> db.test.ensureIndex({ "t" : "text" })

> db.test.find({ "$text" : { "$search" : "time late delay" } }, { "_id" : 0 })
{ "t" : "I'm on time, not late or delayed" }
{ "t" : "Time flies like a banana" }
{ "t" : "I'm either late or delayed" }

> db.test.find({ "$text" : { "$search" : "late delay" } }, { "_id" : 0 })
{ "t" : "I'm on time, not late or delayed" }
{ "t" : "I'm either late or delayed" }

> db.test.find({ "$text" : { "$search" : "late delay \"on time\"" } }, { "_id" : 0 })
{ "t" : "I'm on time, not late or delayed" }

Почему "время" в terms массив в объяснении? Потому что, если фраза "on time" встречается в документе, термин time также, должен. MongoDB использует текстовый индекс в той степени, в которой это возможно, чтобы помочь найти фразу, а затем проверит результаты индекса, чтобы увидеть, который на самом деле соответствует полной фразе, а не только терминам в фразе.

Другие вопросы по тегам