我正在使用SphinxQL查询SphinxQL搜索引擎。我想模拟在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(‘=> |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)) . "')";phone SELECT * FROM index WHERE MATCH(‘I|-| => |is|great’)
由于"|-|“,=>查询中断
您是否知道使SphinxQL查询在SPH_MATCH_ANY模式下工作的更好方法?或者一个更好的regexp让它在所有情况下都能工作?
我知道我可以使用更具限制性的regexp,如下所示:
preg_replace('/[^a-z0-9]+/', '|', $str)但它会拆分字符串,比如'i|phone| is |great‘中的’i-phone is great‘,我不希望这样……
谢谢你,Nico
发布于 2012-10-03 21:32:54
一种方法可能是使用quorom
$sql = "SELECT * FROM index WHERE MATCH('\"" . addslashes($str) . "\"/1')";你需要将-添加到你的charset_table tho中,这样它才能成为单词的一部分。
发布于 2012-10-03 21:42:42
另一个选项是
$query = preg_replace('/(\w+?)[-\'](\w+?)/','$1~$2',$query);
$query = preg_replace('/[^\w\~]+/','|',$query);
$query = preg_replace('/(\w+~\w[\w~]*)/e','"\"".str_replace("~"," ","$1")."\""',$query);把它变成一个短语。
https://stackoverflow.com/questions/12708787
复制相似问题