【问题标题】:Sphinx Converting Plain Old Index to Real-Time (RT) IndexSphinx 将普通旧索引转换为实时 (RT) 索引
【发布时间】:2016-11-22 23:53:37
【问题描述】:

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

我集成了 sphinx 搜索(普通),它工作正常。 但直到最近我才发现 RT 是一个更好的选择。

PLAIN OL' 斯芬克斯

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 狮身人面像

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 index 后,我使用 phpmyadmin 在我的 mysql 中插入了一些人的名字。但是 RT 索引仍然有 0 Hits。

更新 2

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

经过一番研究,我发现了这个Ivinco Blog post,并将我的.conf 修改为这个

新的 RT 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 
  ...
} 

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

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

这不是attach的主要目的吗?

【问题讨论】:

  • 您似乎已经定义了 RT 索引。但是您是否确实向其中添加了任何数据? (例如通过 INSERT,甚至 ATTACH ?)
  • (插入RT索引,不插入数据库,RT索引与数据库无关)
  • 没有 Havent 在 RT 索引中插入任何内容。 @barryhunter。如果 RT 索引没有连接到数据库,那么我必须插入两次数据吗?一次在 DB(MySQL) 和一次在 Sphinx 中?如果是,那么由于我使用的是 PHP 我会做mysqli_query($con,"INSERT INTO ...."); 如何使用 PHP 插入 RT 索引?
  • @barryhunter 说我必须在我刚刚使用 PHP 创建的 sphinx RT 索引中插入 id = 10,name = 'MIKE_445' 我该怎么做?

标签: php mysql sql indexing sphinx


【解决方案1】:

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

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

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

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

【讨论】:

  • 我确实得到了两次。但我真的不想做两次更新/删除/插入。所以我想和ATTACH 一起去,但似乎有问题。请查看我更新的问题@barryhunter
  • 附加是一次性操作,只是在类型之间转换索引。只是有助于索引的初始调试。无需构建“批量”插入脚本即可开始使用。仍然需要“维护”索引、插入新数据和更新修改过的文档等。更新不是自动的,附加无济于事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
相关资源
最近更新 更多