MongoDB. [Ключ слишком велик для индексации] - PullRequest
7 голосов
/ 16 июня 2011

Немного предыстории: Я планирую использовать MongoDB в качестве внешнего интерфейса для некоторых моих веб-сайтов.Фактические данные будут храниться в базе данных SQL Server, и будут фоновые задания, которые будут заполнять MongoDB через заданные интервалы времени для целей только для чтения, чтобы повысить производительность веб-сайта.

Ситуация: Iу меня есть таблица 'x', которую я перевел в коллекцию монго, все работало нормально.

'x' имеет столбец 'c', который изначально был NVARCHAR (MAX) в исходной базе данных, и имеет многоязычный текст наit.

Когда я искал по столбцу 'c', mongo выполнял полное сканирование в коллекции.

Так что я попытался создать файлInidx ({c: 1}), который работал, но когда япроверил журналы mongodb, которые показали мне, что 90% данных не могут быть проиндексированы как [Слишком большой для индексации] !!

И, таким образом, проиндексировал 10% данных и теперь только возвращает результаты из этих 10% !!

Какие у меня есть альтернативы ??

Примечание: Я использовал этот столбец для полнотекстового поиска в SQL Server,теперь я не уверен, должен ли я идти впередс монго или нет: (

Ответы [ 5 ]

24 голосов
/ 03 мая 2014

Попробуйте запустить процесс mongod с этим параметром:

sudo mongod --setParameter failIndexKeyTooLong=false

И затем повторите попытку.

0 голосов
/ 07 августа 2016

Последние ( 2.4 и выше ) сборки MongoDB предоставляют несколько других опций:

  1. Поскольку заявленное желание ОП заключается в полнотекстовом поиске, правильным подходом будет использованиеtext index , который напрямую поддерживает этот вариант использования.
  2. Для точного индекса соответствия для длинных строковых значений вы можете использовать hashed index .
0 голосов
/ 16 июня 2011

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

у первого есть недостаток: вам нужна некоторая «логика» для объединения ключевого слова в поиске, последнее сильно влияет на производительность.
вероятно, если вам действительно нужен полнотекстовый поиск, лучше всего использовать внешний индексатор, такой как solr или lucene.

0 голосов
/ 16 июня 2011

Не используйте монго для полнотекстового поиска

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

Лучшим подходом будет использование серверов полнотекстового поиска (solr / lucene или sphinx), если ваша основная проблемапоиск.

0 голосов
/ 16 июня 2011

Поскольку вы можете сделать некоторые уточнения, вы можете извлечь некоторые ключевые слова и поместить их в поле:

   _keywords : [ "mongodb" , "full search" , "nosql" ]

и создать индекс для этого.

...