Sphinx 将普通旧索引转换为实时 (RT) 索引
Sphinx Converting Plain Old Index to Real-Time (RT) Index
首先,我已经尝试了几天 sphinx,所以我是 sphinx 的新手。
我集成了 sphinx 搜索(普通),运行良好。
但直到最近我才发现 RT 是一个更好的选择。
普通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
...
}
现在如果我查询类似(我正在使用 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 次点击(不工作)
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 次点击。但是如果我 Insert/Update mysql 中的任何内容(使用 PHPMyAdmin/PHP 脚本)RT 没有更新?
这不是附加的主要目的吗?
您需要插入数据两次,是的。 (虽然如上所述可以使用 ATTACH RT 索引,将磁盘索引转换为 RT 索引。旨在 'kickstart' 一个大索引,索引器可以非常有效地构建一个大索引。一旦构建,将索引转换为 RT,然后可以继续直接更新)
想法是应用程序可以直接更新 sphinx 索引,因此它自己可以确保索引是最新的。 (带有索引器的磁盘索引通常按计划重新创建,因此通常会滞后)
更新RT索引需要使用SphinxQL。无法使用 SphinxAPI 客户端。
可以只使用 mysqli :) 与打开数据库连接的方式相同,打开与 sphinx 的第二个连接。
首先,我已经尝试了几天 sphinx,所以我是 sphinx 的新手。
我集成了 sphinx 搜索(普通),运行良好。 但直到最近我才发现 RT 是一个更好的选择。
普通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
...
}
现在如果我查询类似(我正在使用 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 次点击(不工作)
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 次点击。但是如果我 Insert/Update mysql 中的任何内容(使用 PHPMyAdmin/PHP 脚本)RT 没有更新?
这不是附加的主要目的吗?
您需要插入数据两次,是的。 (虽然如上所述可以使用 ATTACH RT 索引,将磁盘索引转换为 RT 索引。旨在 'kickstart' 一个大索引,索引器可以非常有效地构建一个大索引。一旦构建,将索引转换为 RT,然后可以继续直接更新)
想法是应用程序可以直接更新 sphinx 索引,因此它自己可以确保索引是最新的。 (带有索引器的磁盘索引通常按计划重新创建,因此通常会滞后)
更新RT索引需要使用SphinxQL。无法使用 SphinxAPI 客户端。
可以只使用 mysqli :) 与打开数据库连接的方式相同,打开与 sphinx 的第二个连接。