SphinxQL和SPH_MATCH_ANY

时间:2012-10-03 12:45:36

标签: sphinx

我正在使用SphinxQL来查询Sphinxsearch引擎。我想模拟在php API中实现的SPH_MATCH_ANY,如下所示:

$cl->SetMatchMode(SPH_MATCH_ANY);
$cl->Query("test query", "index");

=>搜索与“test”或“query”

匹配的文档

所以,我编写了一个函数(php)来用管道(|)替换空格和其他特殊字符,以便与SphinxQL一起使用:

function formatQuery($str) {
   return trim(preg_replace('/[^-_\'a-z0-9]+/', '|', $str), ' |');
}

$str = "test query";
$sql = "SELECT * FROM index WHERE MATCH('" . addslashes(formatQuery($str)) . "')";

=> SELECT * FROM index WHERE MATCH('test | query');

问题是,对于某些字符,如 - (减号),它可能会破坏查询,例如:

$str = "i-phone is great";
$sql = "SELECT * FROM index WHERE MATCH('" . addslashes(formatQuery($str)) . "')";

=> SELECT * FROM index WHERE MATCH('i-phone | is | great')

=>确定

$str = "i - phone is great";
$sql = "SELECT * FROM index WHERE MATCH('" . addslashes(formatQuery($str)) . "')";

=> SELECT * FROM index WHERE MATCH('i | - | phone | is | great')

=>由于“| - |”

而导致查询失败

您是否知道更好的方法使SphinxQL查询在SPH_MATCH_ANY模式下工作?还是一个更好的正则表达式,使其适用于所有情况?

我知道我可以使用更严格的正则表达式:

preg_replace('/[^a-z0-9]+/', '|', $str)

但它会在'i | phone | is | great'中分割出像“i-phone is great”这样的字符串,我不希望这样......

谢谢你, 尼科

2 个答案:

答案 0 :(得分:0)

一种方法可能是使用quorom

$sql = "SELECT * FROM index WHERE MATCH('\"" . addslashes($str) . "\"/1')";

你需要添加 - 你的charset_table,所以它成为一个单词的一部分。

答案 1 :(得分:0)

另一个选项是

$query = preg_replace('/(\w+?)[-\'](\w+?)/','$1~$2',$query);
$query = preg_replace('/[^\w\~]+/','|',$query);
$query = preg_replace('/(\w+~\w[\w~]*)/e','"\"".str_replace("~"," ","$1")."\""',$query);

将其变成短语。