【问题标题】:Indexing for Sphinx of legacy data generating some errors为生成一些错误的遗留数据的 Sphinx 编制索引
【发布时间】:2024-01-03 01:44:01
【问题描述】:

正在创建 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?]

【问题讨论】:

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


    【解决方案1】:

    调试这个的两个技巧:

    • 注释掉所有属性(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)。

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

    【讨论】:

    • 打它的头!这是日期列。我想64bit_timestamps: true 也应该有一天会投入生产。查看thinking_sphinx 配置文件有这一行(这可能是问题的真正根源)use_64_bit: true 似乎是中等目的......这是rails2 的遗留问题吗?保持?删除?
    • 是的,这适用于 TS v1/v2 - 这个新设置是等效的。