php - Sphinx 将普通旧索引转换为实时 (RT) 索引

标签 php mysql sql indexing sphinx

现在首先我已经试验了几天 sphinx,所以我是 sphinx 的新手。

我集成了 sphinx 搜索(普通),运行良好。 但直到最近我才发现 RT 是一个更好的选择。

PLAIN OL' sphinx

source people
{
  type          = mysql

  sql_host      = localhost
  sql_user      = root
  sql_pass      = 
  sql_db        = test
  sql_port      = 3306 # optional, default is 3306 
 
 sql_query     = SELECT id, name FROM people
 sql_field_string = name
 sql_query_info = SELECT * FROM people WHERE id=$id
}

index people
{
  source            = people 
  ...
}

searchd
{
  listen            = 9312   # Port to listen on
   ....
}

RT sphinx

index people
{
  type = rt
  rt_field = name
  ...  
}
searchd
{
  listen            = 9312   # Port to listen 
  listen = 9306:mysql41
  workers = threads
  ...
}

现在,如果我查询类似(我正在使用 PHPThis Sphinx API (GitHub) )这样的...

  require_once('sphinxapi.php');
  $cl = new SphinxClient();
  $cl->SetServer( "localhost", 9312 ); 
  $cl->SetMatchMode( SPH_MATCH_EXTENDED  );   
  $qq = "Mike";
  $result = $cl->Query('@name "'.$qq.'"','people'); 
  var_dump($result);
  • In Plain-Ol' - 我获得了 5 次点击(因为我有 5 个叫 Mike_xxx 的人)(它正在工作)
  • 在 RT - 我得到 0 次点击(不工作)

P.S - 我在创建 RT 索引后使用 phpmyadmin 在我的 mysql 中插入了一些人的名字。但 RT 索引仍然有 0 次点击。

更新 2

在@barryhunter 的指导下,我考虑利用 ATTACH,因为我不想分别对 MySQL 和 SphinxQL 执行两次查询(插入、更新、删除)。

经过一些研究,我发现了这个 Ivinco Blog post我修改了我的 .conf 到这个

新的 RT Sphinx Conf

source people
{
  type          = mysql

  sql_host      = localhost
  sql_user      = root
  sql_pass      = 
  sql_db        = test
  sql_port      = 3306 # optional, default is 3306 

 sql_query     = SELECT id, name FROM people
 sql_field_string = name
 sql_query_info = SELECT * FROM people WHERE id=$id
}

index people
{
  source            = people 
  ...
} 

index people_rt
{
  type = rt
  rt_field = name
  ...  
}
source people_attach
{ 
    ... 
    sql_query       = select 1 from people_rt
    sql_query_post = ATTACH INDEX people TO RTINDEX people_rt
}
index people_attach
{
    source          = people_attach
}

searchd
{
  listen            = 9312   # Port to listen 
  listen = 9306:mysql41
  workers = threads
  ...
}

现在我在我的终端(Ubuntu)中运行了这些命令

P.S - 所有以前的索引,pids 都被删除了。

sudo indexer -c /path/to/xxx.conf people
sudo indexer -c /path/to/xxx.conf people_attach

#ERROR: index 'people_attach': sql_query: No database selected (DSN=mysql://root:***@localhost:9306/)

sudo searchd 

#WARNING: index 'people_attach': preload: failed to open /var/lib/sphinxsearch/data/people_attach.sph: No such file or directory; NOT SERVING

现在迈克获得了 5 次点击。但是如果我在 mysql 中插入/更新任何内容(使用 PHPMyAdmin/PHP 脚本)RT 不会更新?

这不是 attach 的主要目的吗?

最佳答案

是的,您需要插入数据两次。 (尽管如上所述可以使用 ATTACH RT 索引,将磁盘索引转换为 RT 索引。旨在“启动”大索引,索引器可以非常有效地构建大索引。一旦构建,将索引转换为 RT,然后可以继续直接更新)

想法是应用程序可以直接更新 sphinx 索引,因此它自己可以确保索引是最新的。 (带有索引器的磁盘索引通常按计划重新创建,因此通常会滞后)

要更新 RT 索引需要使用 SphinxQL。无法使用 SphinxAPI 客户端。

可以只使用 mysqli :) 与打开数据库连接的方式相同,打开与 sphinx 的第二个连接。

关于php - Sphinx 将普通旧索引转换为实时 (RT) 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38469492/

相关文章:

SQL - Access 条件更新

php - 将通配符子域重定向到 https

mysql - 在powershell中运行cmd,然后返回powershell进行清理

mysql - MySQL 中何时使用单引号、双引号和反引号

php - 如何从具有相同日期的表中获取最后一个和最后一个(查询)?

mysql - 配置单元左外连接条件

php - PHP 中的日期匹配和插值

php - 如何在mysql的每一行中插入file_name作为值?

php - 使用应用程序文件安装 EasyPHP 和 MySQL 数据

php - (MySQL/PHP) 使用 PHP 将数据插入 MySQL 表