与类似sql的搜索相比,sphinx返回的匹配项更少

与类似sql的搜索相比,sphinx返回的匹配项更少,sphinx,Sphinx,我使用Sphinx在我的网站上进行搜索,但当我使用 LIKE '%19.628%' 返回我要查找的数据(8个匹配项),但与类似sql的搜索相比,使用sphinx时返回的匹配项较少(3个匹配项) 下面是PHP代码 $sp->SetMatchMode(SPH_MATCH_ANY); $sp->SetArrayResult(true); $sp->SetLimits(0,1000000); $results = $sp->Query($query, 'data_base');

我使用Sphinx在我的网站上进行搜索,但当我使用

LIKE '%19.628%'
返回我要查找的数据(8个匹配项),但与类似sql的搜索相比,使用sphinx时返回的匹配项较少(3个匹配项)

下面是PHP代码

$sp->SetMatchMode(SPH_MATCH_ANY);
$sp->SetArrayResult(true);
$sp->SetLimits(0,1000000);
$results = $sp->Query($query, 'data_base');
为什么?


Sphinx不像MySQL那样使用通配符。这里有几个原因,你可能没有得到你想要的结果

  • 在您的示例中,MySQL将计算该字段中的整个值。但是,斯芬克斯对字符串
    19.628
    的理解可能有所不同。如果使用默认值,则Sphinx会将该字符串拆分为两个单词,可能会导致不同的结果

  • $query
    的值到底是多少?我怀疑它可能是类似于“*19.628*”的东西。如果尚未启用,则可能无法获得所需的结果


请记住,sphinx默认为整个单词编制索引,因此,除非使用中缀/前缀索引显式启用它(无论是否启用星号),否则甚至无法获得部分单词匹配

sphinx查询
19.628
只会在文档中的任何位置查找整个单词
19
628
。当然,Asumming
不在您的charset\u表中

事实上,您甚至启用了
任何
模式。所以它只寻找其中一个词

因此,要获得相同的文档匹配,需要使用
Extended
模式。将查询包围在
中以获得短语匹配。并使用
*
代替
%

$cl->setMatchMode(SPH_MATCH_EXTENDED);
$cl->Query('"%19.628%"',$index);
对于索引设置,您不希望在
词组边界中
(因为您希望使用词组搜索),您需要启用部分词匹配-使用
mininfix\u len
,因为希望
*
在词的开头和结尾(如果使用
启用星号=1

您可以选择是否在charset\u表中使用
。对于这个查询来说,这应该无关紧要


(切向的,但您真正高的$limit实际上不适用,setLimits有第三个$max_matches参数,它设置了您可以使用的最高$offset+$limit-默认值为1000)

谢谢您的帮助,我使用的是defautl短语边界,
$query
,只包含19.628,star\U语法,未启用。我更改配置文件添加您的建议,问题仍然存在,下面是我配置文件的一部分:
短语边界\U步骤=100
短语边界=,?,!,U+2026
启用_star=1,我认为这个问题源于sql\u查询,因为我使用这个
SELECT*FROM juris
,可以是?default短语\u边界为空。此外,它只影响存储索引中的单词位置,以阻止显式短语搜索匹配acorss边界。它不影响查询,短语中的字符为界我在查询中没有任何特殊意义。