如何在Sphinx上查询完全匹配的词组?

时间:2011-03-24 19:57:37

标签: php sphinx

似乎Sphinx正在逐字搜索文档。我不知道如何在文档中搜索确切的短语。我尝试了SPH_MATCH_ALLSPH_MATCH_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正在逐字搜索文件......

8 个答案:

答案 0 :(得分:5)

最好的方法是使用SPH_MATCH_EXTENDED2语法并以双引号查询。

$sphinx->SetMatchMode(SPH_MATCH_EXTENDED2);
$sphinx->Query('"Lorem ipsum dolor"'); 

Extended syntax

答案 1 :(得分:3)

使用:

$sphinx->SetMatchMode(SPH_MATCH_PHRASE);

SPH_MATCH_ALL匹配所有查询字词(默认模式)。

SPH_MATCH_ANY匹配任何查询字词。

SPH_MATCH_PHRASE将查询匹配为短语,需要完美匹配。

SPH_MATCH_BOOLEAN将查询匹配为布尔表达式。

SPH_MATCH_EXTENDED将查询匹配为Sphinx内部查询语言中的表达式。

SPH_MATCH_FULLSCAN启用全扫描。

SPH_MATCH_EXTENDED2与SPH_MATCH_EXTENDED相同,加上排名和仲裁搜索支持。

答案 2 :(得分:2)

目前我发现最好的方法是使用^ $修饰符。

如果你在这里查看:Sphinx Extended Syntax你可以看到你可以做类似以下的匹配:

^Exact String$

这应有助于解决问题。

答案 3 :(得分:1)

我知道我迟到了,但是当你从命令行搜索时会发生什么?

sphinx/bin/search -i indexName Lorem ipsum -e2

-e2是扩展匹配2模式。

另外不要忘记重新索引狮身人面像指数:

sphinx/bin/indexer --rotate --config sphinx/etc/sphinx.conf --all

确保searchd正在运行。

答案 4 :(得分:1)

我认为最好的方式......
1.使用extended2模式

2.以这种方式使用语法 - > (提起开始和提交结束)&&双引号

例如

$sphinx->SetMatchMode(SPH_MATCH_EXTENDED2);
$sphinx->Query('(^Lorem ipsum dolor$ "Lorem ipsum dolor")'); 

答案 5 :(得分:1)

我拥有的最佳解决方案是:

$searchTemplate = '@(%s) "^%s$" | "^%s" | "%s" | (%s)';
$sqlToSearch .= sprintf($searchTemplate, 
        "part_name", //Index to search in
        trim($stringToSearch),
        trim($stringToSearch),
        trim($stringToSearch),
        trim($stringToSearch));

在这种情况下,首先会出现完全匹配。

答案 6 :(得分:0)

我相信您所看到的是与搜索结果一起返回的统计信息。当sphinx完成时,它会返回有关找到单词的位置的统计信息,以便您可以根据需要调整搜索。为了验证,您应该进行返回结果的搜索。您还应该对测试索引进行一些测试,在那里您可以知道任何特定搜索的结果。

答案 7 :(得分:0)

如果您尝试了以上所有操作并且没有任何效果,请在您的sphinx.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

...

将min_prefix_len设置为零

并且不要忘记再次重新索引!!