Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何查询Sphinx中精确匹配的短语?_Php_Sphinx - Fatal编程技术网

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()已被弃用。您应该重写查询以使用扩展语法达到相同的效果。