【问题标题】:How to query Sphinx for an exact matching phrase?如何查询 Sphinx 以获得完全匹配的短语?
【发布时间】:2011-03-24 19:57:36
【问题描述】:

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 正在逐字搜索文档...

【问题讨论】:

    标签: php sphinx


    【解决方案1】:

    最好的方法是使用 SPH_MATCH_EXTENDED2 语法并将您的查询放在双引号中。

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

    Extended syntax

    【讨论】:

    • SetMatchMode() 已弃用。你应该重写你的查询以使用扩展语法来达到同样的效果。
    【解决方案2】:

    使用:

    $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 相同,外加排名和仲裁搜索支持。

    【讨论】:

      【解决方案3】:

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

      如果您在此处查看:Sphinx Extended Syntax,您可以看到您可以进行类似于以下内容的匹配:

      ^Exact String$
      

      这应该有助于解决问题。

      【讨论】:

        【解决方案4】:

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

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

        -e2 是扩展的 match 2 模式。

        也不要忘记重新索引 sphinx 索引:

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

        并确保 searchd 正在运行。

        【讨论】:

          【解决方案5】:

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

          2. 以这种方式使用语法 -> (filed-start and filed-end) && double quot

          例如

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

          【讨论】:

            【解决方案6】:

            我最好的解决方案是:

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

            在这种情况下,精确匹配将首先出现。

            【讨论】:

              【解决方案7】:

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

              【讨论】:

              • 是的,我现在正在测试我的文档。我想将我的字符串与数据库中的 name 字段完全匹配..但是即使我在文档中有该行,数组也会返回 total=>0..
              • 我的猜测是它根本找不到它。您应该尝试一个简单的搜索来确保数据被正确索引。或许可以试试命令行搜索功能,以确保这不是 PHP 的问题。
              【解决方案8】:

              如果您尝试了以上所有方法但没有任何效果,请检查您的 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
              
              ...
              

              将 min_prefix_len 设置为零

              别忘了重新索引!!

              【讨论】:

                猜你喜欢
                • 2020-11-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-11-01
                • 1970-01-01
                • 2013-02-05
                相关资源
                最近更新 更多