0

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

+0

привет спасибо за ваш ответ. Я получаю те же результаты, что и ваш пример, я думаю, что моя путаница по-прежнему связана с третьим запросом примера. В третьем примере я бы ожидал, что этот запрос будет соответствовать третьей и второй записанной вами записи, поскольку второй соответствует «позднему» и «задержке». Я думаю, я не могу понять, если он, похоже, игнорирует другие термины при поиске фразы? – robarthur1

+0

После небольшого поиска у меня создается впечатление, что при поиске фраз он использует логический И, а не ИЛИ, который он использует с отдельными словами. Знаете ли вы способ поиска нескольких слов и фраз с помощью логического ИЛИ без запуска нескольких запросов и фильтрации дубликатов? Благодарю. – robarthur1

+0

Можете ли вы привести мне пример того, что вы хотите? Я думаю, что это будет легче всего понять. Думаю, это должен быть новый вопрос. – wdberkeley

Смежные вопросы