Демон Sphinx возвратил ошибку: index product_core: ВНУТРЕННЯЯ ОШИБКА: несоответствие входящей схемы. Только на промежуточном сервере - PullRequest
3 голосов
/ 12 марта 2012

Приложение использует Rails 2.3.12 и ThinkingSphinx 1.4.11. Существует только один индекс для модели продукта, и он работает нормально в окне разработки. После cap staging deploy я создаю конфигурацию на сервере, создаю индекс и запускаю демон:

bundle exec rake ts:conf RAILS_ENV=staging
bundle exec rake ts:index RAILS_ENV=staging
bundle exec rake ts:start RAILS_ENV=staging

После перехода на консоль рельсов я получаю:

>> Product.search('music')  
 Sphinx   Sphinx Daemon returned error: index product_core: INTERNAL ERROR: incoming-      schema mismatch (in=uint account_id:32@192, my=uint account_id:32@0)
ThinkingSphinx::SphinxError: index product_core: INTERNAL ERROR: incoming-schema mismatch (in=uint account_id:32@192, my=uint account_id:32@0)
from /var/www/rebelshop_staging/rebelshop/shared/bundle/ruby/1.8/gems/thinking-sphinx-1.4.11/lib/thinking_sphinx/search.rb:417:in `populate'
from /var/www/rebelshop_staging/rebelshop/shared/bundle/ruby/1.8/gems/thinking-sphinx-1.4.11/lib/thinking_sphinx/search.rb:562:in `call'
from /var/www/rebelshop_staging/rebelshop/shared/bundle/ruby/1.8/gems/thinking-sphinx-1.4.11/lib/thinking_sphinx/search.rb:562:in `retry_on_stale_index'
from /var/www/rebelshop_staging/rebelshop/shared/bundle/ruby/1.8/gems/thinking-sphinx-1.4.11/lib/thinking_sphinx/search.rb:404:in `populate'
from /var/www/rebelshop_staging/rebelshop/shared/bundle/ruby/1.8/gems/thinking-sphinx-1.4.11/lib/thinking_sphinx/search.rb:167:in `method_missing'
from /usr/local/lib/ruby/1.8/irb.rb:310:in `output_value'
from /usr/local/lib/ruby/1.8/irb.rb:159:in `eval_input'
from /usr/local/lib/ruby/1.8/irb.rb:271:in `signal_status'
from /usr/local/lib/ruby/1.8/irb.rb:155:in `eval_input'
from /usr/local/lib/ruby/1.8/irb.rb:154:in `eval_input'
from /usr/local/lib/ruby/1.8/irb.rb:71:in `start'
from /usr/local/lib/ruby/1.8/irb.rb:70:in `catch'
from /usr/local/lib/ruby/1.8/irb.rb:70:in `start'
from /usr/local/bin/irb:13

Конечно, я знаю, что генерация таких индексов после каждого cap staging deploy неоптимальна, и это должно быть решено в промежуточной конфигурации capistrano (общий раздел, связывание и т. Д.), Но сейчас я хочу, чтобы она работала вручную, после этого я будет автоматизировать вещи.

1 Ответ

3 голосов
/ 26 октября 2012

Я получил ту же ошибку, и это было связано с тем, что я создавал 2 индекса для одного и того же поля, один как индекс, другой как атрибут.

Поскольку синтаксис Thinking Sphinx сильно отличается от обычного синтаксиса sphinx.conf, он может быть очень запутанным. Для обычного sphinx.conf вы должны создать обычные поля, а затем вы должны создать те же поля, что и целые числа CRC32, чтобы использовать их для взвешивания.

В Thinking Sphinx вам не нужно этого делать.

В случае account_id выше, я предполагаю, что вы создали его дважды, поэтому возникает ошибка, вам нужно создать его только один раз в блоке define_index модели:

has account_id

Или, если вам нужно поле account_id для чего-то другого, создайте другой псевдоним для атрибута Sphinx:

indexes account_id
has account_id, :type => :integer, :as => :account_id_attribute

:type => :integer не требуется, если это уже целое число, но я оставил его, потому что вы можете превратить нецелое поле в одно для целей взвешивания, например:

has "CRC32(media)", :type => :integer, :as => :media
...