首先,我已经用斯芬克斯做了几天的实验,所以我是斯芬克斯的新手。
我集成了狮身人面像搜索(平原),运行良好。但直到最近,我才发现RT是一个更好的选择。
素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
...
}
现在,如果我查询类似的东西(我使用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);
- In Plain Ol'-我得到了5次点击(因为我有5个人叫Mike_xxx)(这很有效)
- 在RT中-我得到0次命中(无效)
第页。S-在创建RT索引后,我使用phpmyadmin在我的mysql中插入了一些人的名字。但RT指数仍然有0次点击。
更新2
在@barryhunter的指导下,我考虑利用ATTACH
,因为我不想分别为MySQL和SphinxQL执行两次查询(插入、更新、删除)。
经过一点研究,我看到了Ivinco的博客文章,我将我的.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不会更新吗?
这不是附身的主要目的吗?
您需要插入两次数据。(尽管如上所述,可以使用ATTACH RT索引,将磁盘索引转换为RT索引。为了"启动"一个大索引,索引器可以非常有效地构建一个大的索引。一旦构建,将索引转换为RT,然后可以继续直接更新)
其思想是应用程序可以直接更新sphinx索引,因此它本身可以确保索引是最新的。(带有索引器的磁盘索引,通常按时间表重新创建,因此通常滞后)
要更新RT索引,需要使用SphinxQL。无法使用SphinxAPI客户端。
可以只使用mysqli:)就像打开一个到数据库的连接一样,打开第二个到sphinx的连接。