act_as_xapian таблица заданий
Может кто-нибудь объяснить мне внутреннюю работу таблицы acts_as_xapian_jobs?
Я столкнулся с проблемой с acts_as_xapian
плагин недавно, где я продолжал получать следующую ошибку, когда он создает объект с индексированными полями xapian:
Mysql::Error: Duplicate entry 'String-2147483647' for key 2:
INSERT INTO `acts_as_xapian_jobs` (`action`, `model`, `model_id`)
VALUES ('update', 'String', 23730251831560)
Оказывается model_id
Превышено максимальное значение int 2147483647. Обходной путь должен был обновить model_id
использовать bigint. Почему бы model_id
быть таким огромным? Глядя на содержание acts_as_xapian_jobs
кажется, он создает строку для каждого индексируемого поля. Понимание того, как задание создается в таблице, очень поможет.
Вот выборка из таблицы:
mysql> select * from acts_as_xapian_jobs limit 5\G
*************************** 1. row ***************************
id: 19
model: String
model_id: 23804037900560
action: update
*************************** 2. row ***************************
id: 49
model: String
model_id: 23804037191200
action: update
*************************** 3. row ***************************
id: 79
model: String
model_id: 23804037932180
action: update
*************************** 4. row ***************************
id: 109
model: String
model_id: 23804037101700
action: update
*************************** 5. row ***************************
id: 139
model: String
model_id: 23804037722160
action: update
Заранее спасибо,
Amie
1 ответ
Я недавно обнаружил act_as_xapian, и я немного поиграл с этим. Кажется, что acts_as_xapian_jobs
таблица обновляется каждый раз, когда меняется модель. Затем индекс Xapian фактически обновляется в следующий раз rake xapian:update_index
это запустить.
Итак acts_as_xapian_jobs
Таблица в основном просто содержит идентификаторы записей в модели, которые необходимо переиндексировать. Насколько я могу судить, записи добавляются в таблицу только тогда, когда ваша модель изменилась, так что вы меняете / обновляете много записей в вашей базе данных? Это может быть причиной того, что вы переполнили значение max int.
Надеюсь это поможет!