Mongodb сопоставляют символы с акцентом в качестве основного персонажа
В синтаксисе MongoDB "db.foo.find()", как я могу сказать, что он соответствует всем буквам и их акцентированным версиям?
Например, если у меня есть список имен в моей базе данных:
João
Франсуа
Хесус
Как я могу разрешить поиск строк "Жоао", "Франсуа" или "Иисус" в соответствии с данным именем?
Я надеюсь, что мне не нужно делать такой поиск каждый раз:
db.names.find({name : /Fr[aã...][nñ][cç][all accented o characters][all accented i characters]s/ })
Ответы
Ответ 1
Как и в случае с Mongo 3.2, вы можете использовать $text
и установить $diacriticSensitive
в значение false:
{
$text:
{
$search: <string>,
$language: <string>,
$caseSensitive: <boolean>,
$diacriticSensitive: <boolean>
}
}
Подробнее в документах Mongo: https://docs.mongodb.com/manual/reference/operator/query/text/
Ответ 2
Я предлагаю вам добавить индексированное поле типа NameSearchable
упрощенных строк, например.
- João → JOAO
- François → FRANCOIS
- Хесус → JESUS
- Юрген → JUERGEN
То же отображение, которое используется при вставке новых элементов в базу данных, можно использовать при поиске. Исходная строка с правильной оболочкой и акцентами будет сохранена.
Самое главное, что запрос может использовать индексирование. Нечувствительные к регистру запросы и запросы в регулярном выражении не могут использовать индексы (за исключением корневых регулярных выражений) и будут расти на больших коллекциях с запретом.
О, и поскольку упрощенные строки могут быть созданы из исходных строк, это не проблема, чтобы добавить это в существующие коллекции.
Ответ 3
В этом блоге: http://tech.rgou.net/en/php/pesquisas-nao-sensiveis-ao-caso-e-acento-no-mongodb-e-php/
Кто-то использовал подход, который вы пытались сделать. Это, насколько я знаю, единственное решение для последней версии MongoDB.
Ответ 4
Это больше похоже на поиск нечеткого соответствия, который mongoDb не поддерживает в настоящее время.
Вы можете попробовать:
/1. Сохраняйте варианты имени в отдельном элементе коллекции для каждой записи. Затем запрос может быть запущен путем поиска, существует ли поисковый запрос в массиве вариантов.
или
/2. Сохраните строку soundex
для каждого из имен в той же коллекции. Затем для вашей строки поиска, получите строку soundex и запросите базу данных, вы получите результат, имеющий аналогичный результат soundex
к вашему запросу.
Вы можете фильтровать и проверять, что данные больше в вашем script.
Пример:
Код Soundex для François = F652, код Soundex для Francois = F652
Код Soundex для Jesús = J220, код Soundex для Иисуса = J220
Подробнее здесь:
http://creativyst.com/Doc/Articles/SoundEx1/SoundEx1.htm#SoundExConverter