Sphinx搜索精确匹配,然后中缀匹配


Sphinx search for exact match and then infix matches

我使用Sphinx为一个网站提供搜索,当返回相关结果时,我遇到了一点障碍。

为了使我的问题简单,让我们假设我有两个字段,@title和@body,它们的权重为100 &分别为15。当我搜索像"中的"这样的小词时,我希望它对该搜索词的精确匹配进行排名,而然后检查与"in*| in| in*"中的匹配,并将它们排名稍低。有没有办法让你的搜索具有这种专一性?

中'的示例结果:

  1. 印度菜
  2. In Middle
  3. 关于拉丁文的文件

相关设置如下:

在<<p> em> sphinx.conf :
morphology              = stem_en
charset_type            = utf-8
min_word_len            = 2
min_prefix_len          = 0
min_infix_len           = 2
enable_star             = 1
在<<p> em> search.php
$sp->SetMatchMode( SPH_MATCH_EXTENDED2 );
$sp->SetRankingMode( SPH_RANK_PROXIMITY_BM25 );
$sp->SetFieldWeights ( array('title' => 100, 'body' => 15) );

另外,作为旁注:我也有一些实例,部分匹配甚至没有显示在搜索结果中。例如,我搜索了Cow,但是Cowboy没有出现。我还搜索了CowbCowbo,直到我输入Cowboy,我才收到预期的结果。任何想法吗?


这个问题与之前的SO问题相同,但我希望我已经给出了更多关于我的问题的细节,以及我试图保证解决方案的事情。

在形态上看起来像母牛,与牛仔没有关系。

你可以用两种方法来解决它:

  1. 使用wordforms文件Cow> Cowboy
  2. 当启用星号时,您可以将查询从"Cow"更改为"Cow*",这将查找所有以"Cow"开头的单词。

考虑到"in"answers"in"的排名不同,我可以建议在索引中有两个body字段,比如: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");

这应该能奏效。

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