1

Sphinx 0.9.9Thinking Sphinx 2.0.12を使用している Rails 3.2.6 アプリがあります。

インデックスをリアルタイムで更新するには Sphinx が必要です。たとえば、ユーザーが新しい投稿を作成すると、すぐに検索に表示されます。または、投稿を削除すると、削除した瞬間から表示されなくなります。

私はdelta indexingについてのドキュメントに従いました。

このアドバイスに基づいて、20分ごとに実行されて実行されるcronジョブがありますbundle exec rake ts:index RAILS_ENV=production...

デルタ インデックス作成をオンにしても、完全な再インデックスを定期的に実行する必要がなくなるわけではありません。そうしないと、デルタ インデックス自体がコア インデックスと同じくらい大きくなり、分離しておく利点がなくなります。また、モデル レコードを変更するサーバーへのリクエストも遅くなります。

新しいエントリは、そのジョブの実行後にのみ表示されます。

これが私のdefine_index...

define_index do

  indexes(title)
  indexes(entry)

  has user_id
  has created_at
  has updated_at

  set_property :delta => true

end

これが私のproduction.sphinx.conf...

indexer
{
}

searchd
{
  listen = 127.0.0.1:9312
  log = /opt/deployed_rails_apps/my_app/releases/20120713022228/log/searchd.log
  query_log = /opt/deployed_rails_apps/my_app/releases/20120713022228/log/searchd.query.log
  pid_file = /opt/deployed_rails_apps/my_app/releases/20120713022228/log/searchd.production.pid
}

source entry_core_0
{
  type = mysql
  sql_host = localhost
  sql_user = abc
  sql_pass = abc
  sql_db = my_app_production
  sql_query_pre = UPDATE `entries` SET `delta` = 0 WHERE `delta` = 1
  sql_query_pre = SET NAMES utf8
  sql_query_pre = SET TIME_ZONE = '+0:00'
  sql_query = SELECT SQL_NO_CACHE `entries`.`id` * CAST(1 AS SIGNED) + 0 AS `id` , `entries`.`title` AS `title`, `entries`.`entry` AS `entry`, `entries`.`id` AS `sphinx_internal_id`, 0 AS `sphinx_deleted`, 3940594292 AS `class_crc`, `entries`.`user_id` AS `user_id`, UNIX_TIMESTAMP(`entries`.`created_at`) AS `created_at`, UNIX_TIMESTAMP(`entries`.`updated_at`) AS `updated_at` FROM `entries`  WHERE (`entries`.`id` >= $start AND `entries`.`id` <= $end AND `entries`.`delta` = 0) GROUP BY `entries`.`id` ORDER BY NULL
  sql_query_range = SELECT IFNULL(MIN(`id`), 1), IFNULL(MAX(`id`), 1) FROM `entries` WHERE `entries`.`delta` = 0
  sql_attr_uint = sphinx_internal_id
  sql_attr_uint = sphinx_deleted
  sql_attr_uint = class_crc
  sql_attr_uint = user_id
  sql_attr_timestamp = created_at
  sql_attr_timestamp = updated_at
  sql_query_info = SELECT * FROM `entries` WHERE `id` = (($id - 0) / 1)
}

index entry_core
{
  source = entry_core_0
  path = /opt/deployed_rails_apps/my_app/releases/20120713022228/db/sphinx/production/entry_core
  charset_type = utf-8
}

source entry_delta_0 : entry_core_0
{
  type = mysql
  sql_user = abc
  sql_pass = abc
  sql_db = my_app_production
  sql_query_pre = 
  sql_query_pre = SET NAMES utf8
  sql_query_pre = SET TIME_ZONE = '+0:00'
  sql_query = SELECT SQL_NO_CACHE `entries`.`id` * CAST(1 AS SIGNED) + 0 AS `id` , `entries`.`title` AS `title`, `entries`.`entry` AS `entry`, `entries`.`id` AS `sphinx_internal_id`, 0 AS `sphinx_deleted`, 3940594292 AS `class_crc`, `entries`.`user_id` AS `user_id`, UNIX_TIMESTAMP(`entries`.`created_at`) AS `created_at`, UNIX_TIMESTAMP(`entries`.`updated_at`) AS `updated_at` FROM `entries`  WHERE (`entries`.`id` >= $start AND `entries`.`id` <= $end AND `entries`.`delta` = 1) GROUP BY `entries`.`id` ORDER BY NULL
  sql_query_range = SELECT IFNULL(MIN(`id`), 1), IFNULL(MAX(`id`), 1) FROM `entries` WHERE `entries`.`delta` = 1
  sql_attr_uint = sphinx_internal_id
  sql_attr_uint = sphinx_deleted
  sql_attr_uint = class_crc
  sql_attr_uint = user_id
  sql_attr_timestamp = created_at
  sql_attr_timestamp = updated_at
  sql_query_info = SELECT * FROM `entries` WHERE `id` = (($id - 0) / 1)
}

index entry_delta : entry_core
{
  source = entry_delta_0
  path = /opt/deployed_rails_apps/my_app/releases/20120713022228/db/sphinx/production/entry_delta
}

index entry
{
  type = distributed
  local = entry_delta
  local = entry_core
}

私が間違っているかもしれないアイデアはありますか?

4

1 に答える 1

0

これが古いことは承知していますが、Sphinx のバージョンを更新することを検討し、メイン + デルタ スキームの代わりに RT モデルを使用する必要があります。

RT インデックスへのリンク - Sphinx Documentation

于 2013-04-12T14:27:37.770 に答える