我正在使用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');
为什么?
问候
答案 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查询只会在文档中的任何位置查找整个单词19
和628
。 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)