Монго полнотекстового поиска не находит
1026 просмотра
2 ответа
Я пытаюсь реализовать полнотекстовый поиск в моей базе данных Mongo. Это база метаданных звуковых дорожек. Я wan't поиск по artistName
и title
из track
. У меня есть эти записи в tracks
коллекции (показаны только важные поля):
db.tracks.find({},{artistName: 1, title: 1})
{ "_id" : "A10328E00047516670", "artistName" : "Tapani Kansa", "title" : "Tuulia" }
{ "_id" : "A10328E00047516661", "artistName" : "Tapani Kansa", "title" : "Rakkautemme valssi" }
{ "_id" : "A10328E0004751669W", "artistName" : "Tapani Kansa", "title" : "Täysikuu" }
{ "_id" : "A10328E0004751668Y", "artistName" : "Tapani Kansa", "title" : "Muista minua" }
Я создал текстовый индекс для этой коллекции:
db.tracks.createIndex({artistName: 'text', title: 'text', lyrics: 'text'})
Но когда я пытаюсь найти треки, результаты не возвращаются:
rs-ds047345:PRIMARY> db.tracks.find({$text: {$search: 'Tapani'}}).size()
0
rs-ds047345:PRIMARY> db.tracks.find({$text: {$search: 'Rakkautemme valssi'}}).size()
0
Я случайно заметил, что когда я обрезаю несколько букв в конце искомого слова, я начинаю получать некоторые результаты ... так что полнотекстовый поиск как-то работает, но не так, как я хотел бы и ожидал.
db.tracks.find({$text: {$search: 'Tapa'}}).size()
12
rs-ds047345:PRIMARY> db.tracks.find({$text: {$search: 'Rakkaute'}}).size()
1
Может кто-нибудь сказать мне, пожалуйста, как я могу искать в базе данных, используя полные слова, или что я делаю неправильно?
Я пробовал это на MongoDB версий 3.0.8 и 3.2.1
Автор: Honza Hýbl Источник Размещён: 27.10.2019 10:10Ответы (2)
1 плюс
согласно спецификации -
Для поиска текста без учета регистра и диакритического знака оператор $ text соответствует полному основному слову. Таким образом, если поле документа содержит слово blueberry, поиск по синему слову не будет совпадать. Тем не менее, черника или черника будут соответствовать.
то, что я предложу, это нормальный индекс и поиск регулярных выражений
db.tracks.createIndex({"artistName": 1})
db.tracks.createIndex({ "title" : 1})
db.tracks.createIndex({ "lyrics": 1})
db.tracks.find({artistName:"/Tap/[0-10]"}).explain()
квадратная скобка заставит индексное сканирование для регулярного выражения вместо colscan
тестировал на 3.0.6 и 3.2.3 без удачи :(
Автор: profesor79 Размещён: 02.03.2016 05:371 плюс
Итак, проблема была в документах, хранящихся в базе данных. Я не заметил, что они содержат поле с именем language
, которое изменяет поведение полнотекстового поиска, хотя я попытался отключить определение слова, установив language: 'none'
в индекс и запросы.
Когда я переименовал language
поле в другое имя, полнотекстовый поиск начал работать именно так, как я ожидал.
Вопросы из категории :
- mongodb Обновление вложенных документов в mongodb
- mongodb Когда использовать MongoDB или другие системы, ориентированные на документы?
- mongodb MongoDB: Как обновить несколько документов с помощью одной команды?
- mongodb MongoDB: Можно ли сделать запрос без учета регистра?
- mongodb Может ли MongoDB находиться в процессе?
- mongodb Получить имена всех ключей в коллекции
- mongodb SQLite-подобная альтернатива для MongoDB?
- mongodb Как выполнить эквивалент SQL Join в MongoDB?
- mongodb Как установить MongoDB на Windows?
- mongodb Как запустить MongoDB в качестве службы Windows?
- full-text-search Что такое полнотекстовый поиск против LIKE
- full-text-search Инструменты для поиска строк внутри файлов без индексации
- full-text-search Есть ли чистый Python Lucene?
- full-text-search Как я могу управлять релевантностью полнотекстового поиска MySQL, чтобы сделать одно поле более «ценным», чем другое?
- full-text-search Ошибка MySQL: «Столбец столбца» не может быть частью индекса FULLTEXT »
- full-text-search Искать "полное совпадение слов" в MySQL
- full-text-search Алгоритм быстрее, чем BMH (Бойер – Мур – Хорспул) Поиск
- full-text-search MySQL полный текст с основами
- full-text-search Django MySQL полнотекстовый поиск
- full-text-search Обоснование полнотекстовых стоп-слов MySQL