0

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

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

=> 搜索与“测试”或“查询”匹配的文档

因此,我编写了一个函数 (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”之类的字符串,我不希望这样......

谢谢你,尼科

4

2 回答 2

0

一种方法可能是使用 quorom

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

您需要将 - 添加到您的 charset_table 中,因此它成为单词的一部分。

于 2012-10-03T13:32:54.057 回答
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);

把它变成一个短语。

于 2012-10-03T13:42:42.267 回答