Сбой параллельной обработки MR: {ok: 0.0, errmsg: \ "WiredTigerIndex :: insert: ключ слишком велик для индексации, ошибка - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть составной индекс для таблицы, по которой выполняется уменьшение карты

db.jobs.createIndex({
    Name: "text",
    Line1: "text",
    City: "text",
    State: "text",
    Zip: "text",
    PropertyId: "text",
    Line2: "text",
    JobId: 1,
    JobOwner: 1,
    Amount: 1
},   {
 weights: {
   Name: 100,
 },
 name: "custom_text_index"

})

И есть запись, где Строка1, которая имеет текстовый индекс , около 370KB и из-за этого mapreduce завершается с ошибками ниже

2018-04-22T13:34:50.666+0000 E QUERY    [thread1] Error: map reduce failed:{
"code" : 17280,
"ok" : 0,
"errmsg" : "MR parallel processing failed: { ok: 0.0, errmsg: \"WiredTigerIndex::insert: key too large to index, failing  371495 { : { Agency_Id: 190.0, PropertyId: \"070720762\", Name: \"MOUNT SINAI SCHOOL OF M...\", code: 17280, codeName: \"KeyTooLong\" }"

Хотя Mongo Doc говорит, текстовый индекс может быть большим , все ещедействует в случае вышеуказанного составного индекса?или он ограничен ключом индекса в 1024 байта?

1 Ответ

0 голосов
/ 26 апреля 2018

Ограничение в 1024 байта применяется ко всем элементам индекса .В документации указано

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

, а также

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

Это объясняет ошибку, которую вы видите.

Прямо рядом с утверждением, которое вы цитировали из документации

текстовые индексы могут быть большими.

также имеется следующее:

Они содержат одну запись индекса для каждого уникального слова после каждого элемента в каждом индексированном поле для каждого вставленного документа.

Таким образом, весь текстовый индекс может быть больше 1024 байтов, каждая отдельная запись индекса вэто, однако, не должно.

Вот почему я склонен думать, что внутри вашей 370kb Line1 записи есть слово, которое длиннее 1024 байтов.

Чтобы исключитьсоставной индекс как потенциальный преступник, вы можете также изменить индекс, чтобы индексировать только запись Line1 и посмотреть, как это происходит:

db.jobs.createIndex({
    Line1: "text"
}, {
  weights: {
    Name: 100,
  },
  name: "custom_text_index"
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...