0

有人可以向我解释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

提前致谢,

艾米

4

1 回答 1

1

我最近发现了acts_as_xapian,并且一直在玩弄它。似乎acts_as_xapian_jobs每次更改模型时表都会更新。然后,Xapian 索引实际上是在下次rake xapian:update_index运行时更新。

因此,该acts_as_xapian_jobs表基本上只包含模型中需要重新索引的记录的 ID。据我所知,只有在您的模型发生更改时才会将记录添加到表中,所以——您是否正在更改/更新数据库中的大量条目?这可能就是您溢出最大 int 值的原因。

希望这可以帮助!

于 2010-03-12T08:22:03.463 回答