索引遗留数据的Sphinx会产生一些错误

时间:2014-08-14 09:43:59

标签: ruby-on-rails-3.2 sphinx thinking-sphinx

正在创建rails 3.2.18应用程序,从rails 2.3.10应用程序迁移数据。数据通过pg_dump移植并通过psql命令加载,没有任何错误。

通过thinking_sphinx索引的13个模型中出现了一些错误。整个索引中只有8.5个文档中有1个。

indexing index 'norm_core'...
ERROR: index 'norm_core': sql_range_query: ERROR:  integer out of range
 (DSN=pgsql://jerdvo:***@localhost:5432/fna_development).
total 1019 docs, 234688 bytes

索引文件是

ThinkingSphinx::Index.define :norm, :with => :active_record do
    indexes data
    indexes titolo
    indexes massima
    indexes numero
    indexes norm_fulltext
    indexes region.name, :as => :region
    indexes normtype.name, :as => :normtype

    has region_id
    has normtype_id
    has data, :as => :data_timestamp
end

我不确定data_timestamp的最后一个元素的语法,因为它可能是遗留语法...它适用于日期字段 - 来自架构:

    t.date     "data"

其他型号在日期上具有相同的索引方案。但没有人产生错误 [假设该行必须更改,如果在索引或重建之前首先需要rake ts:configure吗?]

1 个答案:

答案 0 :(得分:2)

调试此问题的两个提示:

  • 注释掉所有属性(has调用),运行ts:index任务,确认它有效。然后一次一个地引入每个属性,看看哪一个导致了错误。
  • 检查不起作用的任何属性列的最大值(例如SELECT MAX(data) FROM norms),查看该数据是否有效以及是否在32位无符号整数的范围内。

如果它是冒险进入64位int区域的外键之一,那么您可以将其指定为数据类型:

has normtype_id, :type => :bigint

如果是日期列,那么您需要通知Thinking Sphinx将日期/时间值转换为64位整数时间戳,方法是在config/thinking_sphinx.yml中的每个必要环境中添加以下内容:

development:
  64bit_timestamps: true

我想,问题的第三个来源是主键大于32位整数,但TS应检测bigint列并适当处理文档ID。当然,Sphinx也需要编译来处理64位文档ID,但我希望这是默认的(编译标志,为了参考,为--enable-id64)。

如果这些都没有帮助......那么,好吧,我不知道原因可能是什么。