MongoDB - логическое ИЛИ при поиске слов и фраз с использованием полнотекстового поиска

Я задал связанный вопрос ранее, и как было предложено на постере, этот новый вопрос был создан в качестве продолжения:

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

У меня были некоторые проблемы с неожиданными результатами при использовании полнотекстового поиска в MongoDB, особенно при поиске сочетания слов и фраз.

Используя этот полезный пример, предоставленный постером в предыдущем вопросе...

> 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" }

Первые два запроса ведут себя так, как и следовало ожидать, первый из них ищет "время ИЛИ задержка ИЛИ задержка", а второй - "задержка ИЛИ задержка".

Теперь, прочитав этот раздел документации http://docs.mongodb.org/manual/reference/operator/query/text/, я понял, что третий запрос, включающий фразу, будет искать "задержка ИЛИ задержка И ("вовремя")".

Мой вопрос заключается в том, можно ли искать "задержка ИЛИ задержка ИЛИ (" вовремя ")" в одном текстовом запросе?

1 ответ

Решение

Я прочесал документы по текстовому поиску, и я боюсь, что я не думаю, что это возможно с MongoDB 2.6. Поддержка текстового поиска MongoDB просто не так полна, как истинная система полнотекстового поиска (например, Solr/ вещи, созданные с помощью библиотеки текстового поиска Lucene). В настоящее время нет поддержки булевых операторов в текстовых запросах, поэтому вы не можете изменить значение "поздняя задержка \" на время \"" с "(поздняя ИЛИ задержка) И (\" на время \")" на "поздний" ИЛИ задержка ИЛИ \ "вовремя \"". Могут быть некоторые обходные пути, включающие сохранение массива токенов вместо или в дополнение к тексту или синхронизацию с полнотекстовой поисковой системой, такой как ElasticSearch, но я бы предпочел узнать немного больше о сценарии использования для запроса, прежде чем рекомендовать какие-либо решения.

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