Sphinx搜索完全匹配,然后搜索中缀

时间:2011-08-25 06:29:36

标签: php search sphinx ranking infix-notation

我正在使用Sphinx为网站提供搜索功能,而且在返回相关结果时遇到了一些麻烦。

为了让我的问题变得简单,让我们假设我有两个字段,@ title和@body,它们的权重为100&分别为15。当我搜索“ ”这样的小词时,我想让它对该搜索词的匹配排名更高,然后检查匹配到“在* | * in | * in * '中,并将它们排在略低的位置。有没有办法让你的搜索具有这种特殊性?

中的示例结果:

  1. 印度菜
  2. 中间
  3. 关于拉丁文的文件
  4. 一些相关设置是:

    sphinx.conf

    morphology              = stem_en
    charset_type            = utf-8
    min_word_len            = 2
    min_prefix_len          = 0
    min_infix_len           = 2
    enable_star             = 1
    

    search.php

    $sp->SetMatchMode( SPH_MATCH_EXTENDED2 );
    $sp->SetRankingMode( SPH_RANK_PROXIMITY_BM25 );
    $sp->SetFieldWeights ( array('title' => 100, 'body' => 15) );
    

    此外,作为旁注:我也有一些情况,即部分匹配甚至不会显示在搜索结果中。例如,我搜索了 Cow ,但 Cowboy 没有显示结果。我还搜索了 Cowb Cowbo ,直到我输入 Cowboy 才收到预期的结果。有什么想法吗?


    这个问题和this previous SO question一样,但我希望我已经提供了一些关于我的问题以及我试图保证解决方案的更多细节。

2 个答案:

答案 0 :(得分:3)

貌似形态牛与牛仔无关。

你可以用两种方式解决它:

  1. 使用带有Cow>的wordforms文件牛仔
  2. 启用星标后,您可以将查询从“牛”更改为“牛*”,它会找到以“牛”开头的所有单词。
  3. 考虑到“in”和“ in ”的不同排名,我可以建议索引中有两个正文字段,比方说:body和body_star与body字段中的内容相同。

    在search.php中

    $sp->SetRankingMode( SPH_RANK_PROXIMITY_BM25 );
    $sp->SetMatchingMode( SPH_MATCH_EXTENDED2 );
    $sp->SetFieldWeights ( array('title' => 20, 'body' => 15, 'body_start' => 5) );
    $sp->Query("@body in @body_star *in* @title in");
    

    这应该可以解决问题。

答案 1 :(得分:2)

您也可以在配置中设置expand_keywords选项 http://sphinxsearch.com/docs/1.10/conf-expand-keywords.html 并将排名模式设置为SPH_RANK_SPH04 http://sphinxsearch.com/blog/2010/08/17/how-sphinx-relevance-ranking-works/