Php 如何查询Sphinx中精确匹配的短语?
斯芬克斯似乎正在逐字搜索文件。我不知道如何在文档中查找准确的短语。我尝试了Php 如何查询Sphinx中精确匹配的短语?,php,sphinx,Php,Sphinx,斯芬克斯似乎正在逐字搜索文件。我不知道如何在文档中查找准确的短语。我尝试了SPH\u MATCH\u ALL,SPH\u MATCH\u PHRASE,但都是逐字搜索文档。我正在PHP应用程序中使用它 如何查询Sphinx以匹配精确的字符串 这是我的密码: $sphinx = new SphinxClient(); $mode = SPH_MATCH_PHRASE; $sphinx->setServer('127.0.0.1', 9312); $sphinx->setLimits(0
SPH\u MATCH\u ALL
,SPH\u MATCH\u PHRASE
,但都是逐字搜索文档。我正在PHP应用程序中使用它
如何查询Sphinx以匹配精确的字符串
这是我的密码:
$sphinx = new SphinxClient();
$mode = SPH_MATCH_PHRASE;
$sphinx->setServer('127.0.0.1', 9312);
$sphinx->setLimits(0,1);
$sphinx->setMaxQueryTime(5000);
$sphinx->setMatchMode($mode);
$sphinx->setFieldWeights(array('name' => 100));
$sphinx->setArrayResult(true);
$result = $sphinx->query('Lorem ipsum dolor sit amet, consectetur adipiscing elit.');
print_r($result);
返回结果如下:
Array (
[error] =>
[warning] =>
[status] => 0
[fields] => Array (
[0] => name
[1] => company
[2] => image
[3] => price
)
[attrs] => Array ()
[total] => 0
[total_found] => 0
[time] => 0.000
[words] => Array (
[lorem] => Array (
[docs] => 0
[hits] => 0
)
[ipsum] => Array (
[docs] => 0
[hits] => 0
)
[dolor] => Array (
[docs] => 0
[hits] => 0
)
[sit] => Array (
[docs] => 0
[hits] => 0
)
[amet] => Array (
[docs] => 0
[hits] => 0
)
[consectetur] => Array (
[docs] => 0
[hits] => 0
)
[adipiscing] => Array (
[docs] => 0
[hits] => 0
)
[elit] => Array (
[docs] => 0
[hits] => 0
)
)
)
如您所见,Sphinx正在逐字搜索文档…使用:
$sphinx->SetMatchMode(SPH_MATCH_PHRASE);
SPH_MATCH_ALL匹配所有查询词(默认模式)
SPH_MATCH_ANY匹配任何查询词
SPH_MATCH_短语匹配查询作为短语,需要完全匹配
SPH_MATCH_布尔匹配查询作为布尔表达式
SPH_MATCH_扩展匹配查询作为Sphinx内部查询语言中的一个表达式
SPH_匹配_FULLSCAN启用FULLSCAN
SPH_MATCH_EXTENDED2与SPH_MATCH_EXTENDED2相同,并支持排名和仲裁搜索。我相信您看到的是随搜索结果返回的统计信息。当sphinx完成时,它会返回找到单词的位置的统计信息,以便在必要时调整搜索。为了验证,您应该执行返回结果的搜索。您还应该在测试索引上进行一些测试,您知道任何特定搜索的结果。我知道我迟到了,但是当您从命令行搜索时会发生什么
sphinx/bin/search -i indexName Lorem ipsum -e2
e2扩展为匹配2模式
另外,不要忘记重新编制斯芬克斯索引的索引:
sphinx/bin/indexer --rotate --config sphinx/etc/sphinx.conf --all
并确保searchd正在运行 最好的方法是使用SPH\u MATCH\u EXTENDED2语法,并用双引号引用查询
$sphinx->SetMatchMode(SPH_MATCH_EXTENDED2);
$sphinx->Query('"Lorem ipsum dolor"');
目前我发现最好的方法是使用^$modifiers 如果您在此处查看:您可以看到您可以进行类似以下内容的匹配:
^Exact String$
这应该有助于解决问题。我认为最好的办法是……1.使用extended2模式
和
2.以这种方式使用语法->(归档开始和归档结束)&double quot
比如说
$sphinx->SetMatchMode(SPH_MATCH_EXTENDED2);
$sphinx->Query('(^Lorem ipsum dolor$ "Lorem ipsum dolor")');
我的最佳解决方案是:
$searchTemplate = '@(%s) "^%s$" | "^%s" | "%s" | (%s)';
$sqlToSearch .= sprintf($searchTemplate,
"part_name", //Index to search in
trim($stringToSearch),
trim($stringToSearch),
trim($stringToSearch),
trim($stringToSearch));
在这种情况下,精确匹配将首先出现。如果您尝试了以上所有操作,但没有任何效果,请在sphinx.conf文件和索引conf上检查此参数
index lol
{
source = lol
path = /var/lib/sphinxsearch/data/lol
morphology = none
min_word_len = 3
min_prefix_len = 0
min_infix_len = 0
...
将最小前缀设置为零
别忘了再次重新编制索引 是的,我正在测试我的文档。我希望将我的字符串与数据库中的名称字段完全匹配。。但是数组返回total=>0,即使我在文档中有那一行..我猜它根本找不到它。您应该尝试进行简单的搜索,以确保数据被正确索引。也许可以尝试使用命令行搜索函数来确保它不是PHP的问题。SetMatchMode()已被弃用。您应该重写查询以使用扩展语法达到相同的效果。