mysql - 如何让 Sphinx 实时索引?

标签 mysql ruby-on-rails full-text-search sphinx thinking-sphinx

我有一个 Rails 3.2.6 应用程序,我正在使用 Sphinx 0.9.9Thinking Sphinx 2.0.12 .

我需要 Sphinx 实时更新它的索引。例如,当用户创建新帖子时,它将立即显示在搜索中。或者,如果他们删除了一个帖子,它不会显示,从他们删除它的那一刻开始。

我遵循了关于 delta indexing 的文档.

根据这个建议,我有一个 cron 作业,每二十分钟执行一次并运行 bundle exec rake ts:index RAILS_ENV=production...

Turning on delta indexing does not remove the need for regularly running a full re-index, as otherwise the delta index itself will grow to become just as large as the core indexes, and this removes the advantage of keeping it separate. It also slows down your requests to your server that make changes to the model records.

新条目仅在该作业运行后出现。

这是我的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
}

知道我可能做错了什么吗?

最佳答案

我知道这是旧的,但你应该考虑更新你的 Sphinx 版本并选择 RT 模型而不是 main+delta 方案。

Link to RT indexes - Sphinx Documentation

关于mysql - 如何让 Sphinx 实时索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11637613/

相关文章:

mysql - 转义字符串不起作用

php - 使用 MAMP 在 Mac OS 中通过终端连接到 MYSQLi

mysql - mysql 全文搜索的巧妙替代

postgresql - 如何创建始终作为带有 Sequelize 的列生成的 tsvector?

带有 IN 日期的 MySQL 过程失败

java - 在数据库中插入冗余数据

ruby-on-rails - 如何使用 ActionText has_rich_text 播种数据?

ruby-on-rails - 如果 key 有空格,如何使用 HDEL 删除 key

ruby-on-rails - Rails/Heroku : fatal: The remote end hung up unexpectedly

mysql - 可扩展的 'google suggestions' 类系统