与搜索等sql相比,sphinx返回的匹配次数较少

时间:2013-08-31 17:14:39

标签: sphinx

我正在使用Sphinx在我的网站上进行搜索,但我有一件事,当我在phpmyadmin中搜索时使用

LIKE '%19.628%'

返回我正在寻找的数据(8个匹配),但是当我使用sphinx时,在sql LIKE搜索中返回较少匹配(3个匹配)。

这里是PHP代码

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

为什么?

问候

2 个答案:

答案 0 :(得分:1)

Sphinx并没有像MySQL那样使用通配符。以下是您可能无法获得所需结果的几个原因;

  • 在您的示例中,MySQL将评估该字段中的整个值。但是,Sphinx可能会看到字符串19.628有所不同。如果您使用的是默认phrase boundary,则Sphinx会将该字符串分解为2个字,可能会导致不同的结果。

  • $query的价值到底是什么?我怀疑这将是' * 19.628 *'的内容。如果您未启用star syntax,则可能无法获得您正在寻找的结果。

答案 1 :(得分:1)

请记住,sphinx默认情况下对整个单词进行索引,因此除非使用infix / prefix indexing明确启用它,否则不会获得部分单词匹配 - 有或没有enable_star。

19.628的sphinx查询只会在文档中的任何位置查找整个单词19628。 Asumming .当然不在你的charset_table中!

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

因此要获得相同的文档匹配,需要使用Extended模式。在"中查询查询以获得词组匹配。并使用*代替%

$cl->setMatchMode(SPH_MATCH_EXTENDED);
$cl->Query('"%19.628%"',$index);

对于索引设置,您不希望.中有phrase_boundary(因为您要使用词组搜索),您需要启用部分词匹配 - 使用min_infix_len,因为想要{ {1}}在单词的开头和结尾(如果使用*)。

您可以选择是否要在charset_table中使用enable_star=1。对于这个查询,它应该没什么关系。

(tangental,但你真的很高的$ limit不会适用,setLimits有第三个$ max_matches参数,它设置了你可以使用的最高$ offset + $ limit - 默认为1000)