我已将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
进行搜索?
答案 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' )));