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 использует текстовый индекс в той степени, в которой это возможно, чтобы помочь найти фразу, а затем проверит результаты индекса, чтобы увидеть, который на самом деле соответствует полной фразе, а не только терминам в фразе.