Подтвердить что ты не робот

Mongodb сопоставляют символы с акцентом в качестве основного персонажа

В синтаксисе MongoDB "db.foo.find()", как я могу сказать, что он соответствует всем буквам и их акцентированным версиям?

Например, если у меня есть список имен в моей базе данных:
João
Франсуа
Хесус

Как я могу разрешить поиск строк "Жоао", "Франсуа" или "Иисус" в соответствии с данным именем?
Я надеюсь, что мне не нужно делать такой поиск каждый раз:
db.names.find({name : /Fr[aã...][nñ][cç][all accented o characters][all accented i characters]s/ })

4b9b3361

Ответ 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

То же отображение, которое используется при вставке новых элементов в базу данных, можно использовать при поиске. Исходная строка с правильной оболочкой и акцентами будет сохранена.

Самое главное, что запрос может использовать индексирование. Нечувствительные к регистру запросы и запросы в регулярном выражении не могут использовать индексы (за исключением корневых регулярных выражений) и будут расти на больших коллекциях с запретом.

О, и поскольку упрощенные строки могут быть созданы из исходных строк, это не проблема, чтобы добавить это в существующие коллекции.

Ответ 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