Монго полнотекстового поиска не находит

mongodb full-text-search

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:37

1 плюс

Решение

Итак, проблема была в документах, хранящихся в базе данных. Я не заметил, что они содержат поле с именем language, которое изменяет поведение полнотекстового поиска, хотя я попытался отключить определение слова, установив language: 'none'в индекс и запросы.

Когда я переименовал languageполе в другое имя, полнотекстовый поиск начал работать именно так, как я ожидал.

Автор: Honza Hýbl Размещён: 03.03.2016 08:50
Вопросы из категории :
32x32