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

时间:2016-07-19 22:24:22

标签: php mysql sql indexing 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 Sphinx

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

现在,如果我查询类似的内容(我使用 PHP This 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);
  • 在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 - 所有以前的索引,pid都已删除。

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不更新?

这不是附加的主要目的吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

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