在Sphinx中近似“包含”的最佳方法是什么?

时间:2017-03-03 14:03:00

标签: sphinx

我有一个包含多个索引的非常复杂的sphinx config文件。主要的一个(idx_Main)不仅仅是巨大的索引200万+记录table。有时我遇到意外的搜索(SphinxQL)结果,由于长时间旋转,测试成为一项挑战。理想情况下,我可以在带有一些样本记录的测试表上运行这个完全相同的索引。

但是我没有找到一个很好的方法来做到这一点;

如果我使用其他索引进行复制和粘贴(例如idx_test),我很快就会退出'同步(更改为idx_test,而不是继续转换为idx_Main索引,反之亦然)

如果我只是更改Select我会覆盖原始索引

如果我更改Select和索引名称以及src_index并且旋转我似乎搞乱了Sphinx,因为我现在有一个不再存在的存储索引(idx_Main)配置文件。

在一个理想的世界中,我可以在配置中拥有Include,这样我就可以存储。

{ idx_Main 各种设置 }

{ idx_Test 包括idx_Main设置 }

但我认为没办法做到这一点。那么最有效的方法是使用相同的设置在较小的表上测试大型生产指数的变化,而不会破坏/覆盖生产/主要指数?

1 个答案:

答案 0 :(得分:0)

它没有得到很好的宣传,但sphinx配置文件本身可以是一个脚本。 (例如PHP,Perl,甚至SH等)特别是PHP非常适合实现包含。

sphinx.conf中:

#!/usr/bin/php
source src {

...
index inx1 {
  <?php include "main_settings.conf"; ?>
  ...

http://sphinxsearch.com/blog/2013/11/05/sphinx-configuration-features-and-tricks/

但在大多数情况下也可以使用继承   - 在“模板”索引中定义大量设置   - 那么最终索引只需要它想要覆盖的设置(比如路径!) 它在关于三角洲的部分中得到证明 http://sphinxsearch.com/docs/current.html#delta-updates

编辑添加,就拥有测试索引而言,继承以及sql_query_range相当酷。

可以完全按照需要设置主索引(但使用sql_query_range),然后创建第二个测试索引,该索引仅覆盖sql_query_range。无需重新声明sql_query或任何sql_attr_ *字段等。因此更改主索引,测试索引也会更新。

source main {
....
    sql_query_range = SELECT MIN(id),MAX(id) FROM documents
    sql_query = SELECT * FROM documents WHERE id>=$start AND id<=$end
    sql_attr_uint = category_id
...
}

...然后创建测试索引,只能重新声明sql_query_range

source main_test : main {
    sql_query_range = SELECT 1,1000
}

index main_test : main {
    path = /var/sphinx/main_test
}

这就是创建第二个“样本”索引所需的全部内容,它重复使用完全相同的设置(除了文档数量!)

(好吧,也许不是,如果使用sql_joined_field和/或sql_attr_multi则更复杂http://sphinxsearch.com/bugs/view.php?id=1591