将属性添加到 thinking sphinx 索引配置导致索引失败
Adding attribute to thinking sphinx index config causing indexing fail
给定架构:
create_table "letters", force: :cascade do |t|
t.string "title", limit: 255
t.text "content", limit: 16777215
t.date "issue_date"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "osha_id", limit: 4
t.string "status", limit: 255
end
indices/letter_index.rb
ThinkingSphinx::Index.define :letter, :with => :real_time do
# fields
indexes title, :sortable => true
indexes content
indexes issue_date_as_string
# attributes
has status, :type => :string
has created_at, :type => :timestamp
has updated_at, :type => :timestamp
end
当我 rake ts:regenerate
没有 has status, :type => :string
行时,它生成索引就好了。
但是当我添加该行时,我会收到一屏错误消息,其中最相关的似乎是
/home/tim/.rvm/gems/ruby-2.2.1/gems/rake-12.0.0/exe/rake:27:in '<top (required)>'
Mysql2::Error: unknown column: 'status'
我对错误试图告诉我的内容以及它为什么首先失败感到非常困惑。我是否遗漏了一些明显的东西?
[编辑以添加更多信息]
完整的错误输出(转储数据库内容后):
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:93:in `rescue in query'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:96:in `query'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:73:in `execute'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/transcriber.rb:21:in `block (2 levels) in copy'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:39:in `block in take'
/home/tim/.rvm/gems/ruby-2.2.1/gems/innertube-1.1.0/lib/innertube.rb:138:in `take'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:37:in `take'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/transcriber.rb:20:in `block in copy'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.4/lib/active_support/notifications.rb:164:in `block in instrument'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.4/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.4/lib/active_support/notifications.rb:164:in `instrument'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/logger.rb:3:in `log'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/transcriber.rb:19:in `copy'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/populator.rb:16:in `block in populate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/relation/batches.rb:124:in `find_in_batches'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/querying.rb:9:in `find_in_batches'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/populator.rb:15:in `populate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/populator.rb:3:in `populate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/rake_interface.rb:30:in `block in generate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/rake_interface.rb:29:in `each'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/rake_interface.rb:29:in `generate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/tasks.rb:28:in `block (2 levels) in <top (required)>'
/home/tim/.rvm/gems/ruby-2.2.1/gems/rake-12.0.0/exe/rake:27:in `<top (required)>'
Mysql2::Error: unknown column: 'status'
/home/tim/.rvm/gems/ruby-2.2.1/gems/mysql2-0.3.21/lib/mysql2/client.rb:80:in `_query'
/home/tim/.rvm/gems/ruby-2.2.1/gems/mysql2-0.3.21/lib/mysql2/client.rb:80:in `block in query'
/home/tim/.rvm/gems/ruby-2.2.1/gems/mysql2-0.3.21/lib/mysql2/client.rb:79:in `handle_interrupt'
/home/tim/.rvm/gems/ruby-2.2.1/gems/mysql2-0.3.21/lib/mysql2/client.rb:79:in `query'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:121:in `results_for'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:88:in `query'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:73:in `execute'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/transcriber.rb:21:in `block (2 levels) in copy'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:39:in `block in take'
/home/tim/.rvm/gems/ruby-2.2.1/gems/innertube-1.1.0/lib/innertube.rb:138:in `take'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:37:in `take'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/transcriber.rb:20:in `block in copy'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.4/lib/active_support/notifications.rb:164:in `block in instrument'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.4/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.4/lib/active_support/notifications.rb:164:in `instrument'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/logger.rb:3:in `log'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/transcriber.rb:19:in `copy'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/populator.rb:16:in `block in populate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/relation/batches.rb:124:in `find_in_batches'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/querying.rb:9:in `find_in_batches'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/populator.rb:15:in `populate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/populator.rb:3:in `populate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/rake_interface.rb:30:in `block in generate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/rake_interface.rb:29:in `each'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/rake_interface.rb:29:in `generate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/tasks.rb:28:in `block (2 levels) in <top (required)>'
/home/tim/.rvm/gems/ruby-2.2.1/gems/rake-12.0.0/exe/rake:27:in `<top (required)>'
Tasks: TOP => ts:regenerate => ts:generate
(See full trace by running task with --trace)
进一步的无偿信息——这显示了我尝试过的各种方法,所有这些都失败了,并出现了相同的 unknown column
错误:
ThinkingSphinx::Index.define :letter, :with => :real_time do
# fields
indexes title, :sortable => true
indexes content
#indexes issue_date
indexes issue_date_as_string # this one works!
#indexes status
#indexes status_as_string
#indexes osha_id
#indexes issue_date
# attributes
#has status, :type => :string
has created_at, :type => :timestamp
has updated_at, :type => :timestamp
end
*_as_string
方法只是盲目尝试:
models/letter.rb:
# experimental for thinking sphinx indexing on issue date
def issue_date_as_string
self.issue_date.to_s
end
def status_as_string
self.status.to_s
end
感谢蒂姆所有额外的细节。
我认为这里的问题与 Thinking Sphinx 中的一个错误有关,该错误导致 ts:regenerate
未正确清除索引文件,因此它们仍在使用旧模式(没有 status
属性)。这意味着任何填充新数据的尝试都会遇到该错误。
不过,我刚刚修复了这个错误,Thinking Sphinx 的 v3.3.0 版本包含了它。您能否升级(有 no breaking changes)并查看是否可以解决问题?
给定架构:
create_table "letters", force: :cascade do |t|
t.string "title", limit: 255
t.text "content", limit: 16777215
t.date "issue_date"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "osha_id", limit: 4
t.string "status", limit: 255
end
indices/letter_index.rb
ThinkingSphinx::Index.define :letter, :with => :real_time do
# fields
indexes title, :sortable => true
indexes content
indexes issue_date_as_string
# attributes
has status, :type => :string
has created_at, :type => :timestamp
has updated_at, :type => :timestamp
end
当我 rake ts:regenerate
没有 has status, :type => :string
行时,它生成索引就好了。
但是当我添加该行时,我会收到一屏错误消息,其中最相关的似乎是
/home/tim/.rvm/gems/ruby-2.2.1/gems/rake-12.0.0/exe/rake:27:in '<top (required)>'
Mysql2::Error: unknown column: 'status'
我对错误试图告诉我的内容以及它为什么首先失败感到非常困惑。我是否遗漏了一些明显的东西?
[编辑以添加更多信息]
完整的错误输出(转储数据库内容后):
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:93:in `rescue in query'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:96:in `query'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:73:in `execute'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/transcriber.rb:21:in `block (2 levels) in copy'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:39:in `block in take'
/home/tim/.rvm/gems/ruby-2.2.1/gems/innertube-1.1.0/lib/innertube.rb:138:in `take'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:37:in `take'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/transcriber.rb:20:in `block in copy'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.4/lib/active_support/notifications.rb:164:in `block in instrument'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.4/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.4/lib/active_support/notifications.rb:164:in `instrument'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/logger.rb:3:in `log'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/transcriber.rb:19:in `copy'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/populator.rb:16:in `block in populate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/relation/batches.rb:124:in `find_in_batches'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/querying.rb:9:in `find_in_batches'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/populator.rb:15:in `populate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/populator.rb:3:in `populate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/rake_interface.rb:30:in `block in generate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/rake_interface.rb:29:in `each'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/rake_interface.rb:29:in `generate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/tasks.rb:28:in `block (2 levels) in <top (required)>'
/home/tim/.rvm/gems/ruby-2.2.1/gems/rake-12.0.0/exe/rake:27:in `<top (required)>'
Mysql2::Error: unknown column: 'status'
/home/tim/.rvm/gems/ruby-2.2.1/gems/mysql2-0.3.21/lib/mysql2/client.rb:80:in `_query'
/home/tim/.rvm/gems/ruby-2.2.1/gems/mysql2-0.3.21/lib/mysql2/client.rb:80:in `block in query'
/home/tim/.rvm/gems/ruby-2.2.1/gems/mysql2-0.3.21/lib/mysql2/client.rb:79:in `handle_interrupt'
/home/tim/.rvm/gems/ruby-2.2.1/gems/mysql2-0.3.21/lib/mysql2/client.rb:79:in `query'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:121:in `results_for'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:88:in `query'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:73:in `execute'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/transcriber.rb:21:in `block (2 levels) in copy'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:39:in `block in take'
/home/tim/.rvm/gems/ruby-2.2.1/gems/innertube-1.1.0/lib/innertube.rb:138:in `take'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/connection.rb:37:in `take'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/transcriber.rb:20:in `block in copy'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.4/lib/active_support/notifications.rb:164:in `block in instrument'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.4/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.4/lib/active_support/notifications.rb:164:in `instrument'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/logger.rb:3:in `log'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/transcriber.rb:19:in `copy'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/populator.rb:16:in `block in populate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/relation/batches.rb:124:in `find_in_batches'
/home/tim/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.4/lib/active_record/querying.rb:9:in `find_in_batches'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/populator.rb:15:in `populate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/real_time/populator.rb:3:in `populate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/rake_interface.rb:30:in `block in generate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/rake_interface.rb:29:in `each'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/rake_interface.rb:29:in `generate'
/home/tim/.rvm/gems/ruby-2.2.1/gems/thinking-sphinx-3.2.0/lib/thinking_sphinx/tasks.rb:28:in `block (2 levels) in <top (required)>'
/home/tim/.rvm/gems/ruby-2.2.1/gems/rake-12.0.0/exe/rake:27:in `<top (required)>'
Tasks: TOP => ts:regenerate => ts:generate
(See full trace by running task with --trace)
进一步的无偿信息——这显示了我尝试过的各种方法,所有这些都失败了,并出现了相同的 unknown column
错误:
ThinkingSphinx::Index.define :letter, :with => :real_time do
# fields
indexes title, :sortable => true
indexes content
#indexes issue_date
indexes issue_date_as_string # this one works!
#indexes status
#indexes status_as_string
#indexes osha_id
#indexes issue_date
# attributes
#has status, :type => :string
has created_at, :type => :timestamp
has updated_at, :type => :timestamp
end
*_as_string
方法只是盲目尝试:
models/letter.rb:
# experimental for thinking sphinx indexing on issue date
def issue_date_as_string
self.issue_date.to_s
end
def status_as_string
self.status.to_s
end
感谢蒂姆所有额外的细节。
我认为这里的问题与 Thinking Sphinx 中的一个错误有关,该错误导致 ts:regenerate
未正确清除索引文件,因此它们仍在使用旧模式(没有 status
属性)。这意味着任何填充新数据的尝试都会遇到该错误。
不过,我刚刚修复了这个错误,Thinking Sphinx 的 v3.3.0 版本包含了它。您能否升级(有 no breaking changes)并查看是否可以解决问题?