Mongodb соответствуют акцентированным символам в качестве основного символа - PullRequest
13 голосов
/ 10 октября 2011

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

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

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

Ответы [ 4 ]

16 голосов
/ 20 сентября 2016

Начиная с 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/

9 голосов
/ 29 февраля 2012

Я предлагаю вам добавить индексированное поле, например NameSearchable упрощенных строк, например

  • Жуан -> JOAO
  • Франсуа -> ФРАНКУА
  • Хесус -> ИИСУС
  • Юрген -> ЮРГЕН

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

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

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

2 голосов
/ 29 февраля 2012

В этом блоге: http://tech.rgou.net/en/php/pesquisas-nao-sensiveis-ao-caso-e-acento-no-mongodb-e-php/

Кто-то использовал подход, который вы пытались сделать. Насколько я знаю, это единственное решение для последней версии MongoDB.

0 голосов
/ 10 октября 2011

Похоже, что поиск нечетких соответствий не поддерживается mongoDb.Вы можете попробовать:

/ 1.Сохраните варианты названия в отдельном элементе в коллекции для каждой записи.Затем можно выполнить запрос, обнаружив, существует ли искомое условие в массиве вариантов.

или

/ 2.Сохраните soundex строку для каждого из имен в одной коллекции.Затем для вашей строки поиска, получите строку soundex и запросите базу данных, вы получите результат, который будет иметь Soundex результат, аналогичный вашему запросу.Вы можете фильтровать и проверять эти данные больше в вашем скрипте.пример:

Soundex код для Франсуа = F652, Soundex код для Франсуа = F652

Soundex код для Jesús = J220, Soundex код для Иисуса = J220

Проверьте больше здесьhttp://creativyst.com/Doc/Articles/SoundEx1/SoundEx1.htm#SoundExConverter

...