在Sphinx中使用文本/字符串值创建过滤器

时间:2011-04-20 20:08:55

标签: php sphinx

我已将Sphinx搜索安装为我的搜索引擎,并且我尝试使用setFilter()SetSelect()为搜索添加一些额外功能,这样我就可以WHERE/AND条款。但每当我尝试搜索时,它都不会返回结果而不是结果。

这是我的sphinx.conf:http://pastebin.com/M6Kd71u0

这是PHP代码:

require("sphinxapi.php");

$host = "localhost";
$port = 9312;
$index = "llgenre";
$select1 = "cartoon";
$label6 = "children";
$type = 4;
$limit = 20;
$ranker = SPH_RANK_PROXIMITY_BM25;
$mode = SPH_MATCH_ALL;

$sphinx = new SphinxClient();
$sphinx->setServer($host, $port);
$sphinx->setConnectTimeout(0);
$sphinx->setMatchMode($mode);
$sphinx->setRankingMode($ranker);
$sphinx->setSelect('*, select1="'.$select1.'" AND label6="'.$label6.'" AS mycond');
$sphinx->setFilter('mycond', array(1));

$res = $sphinx->query($type, $index);

die(var_dump($res));

如何按type = 4进行搜索,select1使用cartoon进行搜索,最后使用label6进行children进行搜索?

1 个答案:

答案 0 :(得分:16)

我相信你要做的是将字符串过滤为属性。参考Sphinx FAQ,他们概述了程序

  

如何过滤,排序或分组   字符串列没有字符串   属性?

     

你可以做所有这些,除了   精确的长度分选   几个指数。

     

要过滤和分组,您可以替换   具有唯一数字ID的字符串。   有时它可能创造一个   数据库中的查找字典(例如   对于固定的城市名单或   国家),甚至使用现有的   一,用其ID替换字符串   那个字典,然后过滤和分组   在那个ID上。如果没有,你可以随时   用校验和替换字符串,   例如。采用CRC32()或(任意)64位   来自MD5()的索引时间(不需要   改变表!),使用它来存储它   sql_attr_uint或sql_attr_bigint   分别,然后过滤或分组   关于该校验和属性。(注意   CRC32()有一定几率   如果你有数百万的冲突   字符串,但几乎没有机会   MD5()碰撞。)

所以,在我的sphinx.conf中,我可能会有以下内容......

sql_query = SELECT CRC32(string_field) AS `string_field` FROM `table`

sql_attr_uint = string_field

然后在PHP中,我会像这样在字段上应用过滤器......

$sphinx->SetFilter('string_field', array(crc32( 'filter_string' ));

-

不幸的是,当转换为crc32时,PHP有一个恼人的问题(bug?)...涉及无符号整数或其他东西..

我使用以下函数正确转换

class Encode {
    public static function crc32($val){
        $checksum = crc32($val);
        if($checksum < 0) $checksum += 4294967296;
        return $checksum;
    }
}

-

小心字符大小写!您可以选择在索引时将列转换为小写,例如。

sql_query = SELECT CRC32(LOWER(string_field)) AS `string_field` FROM `table`

并搜索...

$sphinx->SetFilter('string_field', array(crc32(strtolower( 'Filter_String' )));