Полнотекстовый поиск в MongoDB не дает ожидаемого результата для "@@@" - PullRequest
0 голосов
/ 06 сентября 2018

Итак, у меня есть документ в коллекции с одним из полей, имеющим значение "@@@" Я проиндексировал коллекцию и попытался выполнить запрос:

db.getCollection('TestCollection').find({$text:{$search:"\"@@@\""}})

Но это не показало результат

Как я могу обойти это?

Образец документа:

{
"_id" : ObjectId("5b90dc6d3de8562a6ef7c409"),
"field" : "value",
"field2" : "@@@"
}

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Текстовый поиск предназначен для индексирования строк на основе языковой эвристики . Индексирование текста включает два основных шага: токенизация (преобразование строки в отдельные термины интереса) с последующим выводом (преобразование каждого термина в корневую форму для индексации на основе по языковым правилам).

На этапе токенизации определенные символы (например, знаки пунктуации, такие как @) классифицируются как разделители слов (или разделители ), а не для ввода текста и используются для разделения исходной строки на термины. Специфичные для языка стоп-слова (общие слова, такие как "the", "is" или "on" на английском языке) также исключаются из текстового индекса.

Поскольку поисковая фраза @@@ полностью состоит из разделителей, в текстовом указателе нет соответствующей записи.

Если вы хотите сопоставить общие строковые шаблоны, вам следует использовать регулярные выражения вместо текстового поиска. Например: db.getCollection('TestCollection').find({field2:/@@@/}). Однако обратите внимание на предостережения при использовании индекса для регулярных выражений.

0 голосов
/ 06 сентября 2018

Ваш запрос имеет много фигурных скобок, удалите их:

db.getCollection('so2').find({$text:{$search:"\"@@@\""}})

Если вы запустите его, Монго сообщит вам, что вам не хватает текстового индекса. Добавьте это так:

db.so2.createIndex( { field2: "text" } )

Значение, которое вы используете, довольно мало. Попробуйте использовать более длинные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...