【问题标题】:Sphinx search for exact match and then infix matchesSphinx 搜索完全匹配然后中缀匹配
【发布时间】:2011-08-25 06:29:35
【问题描述】:

我正在使用 Sphinx 为网站提供搜索,但在返回相关结果时遇到了一些问题。

为了让我的问题简单,假设我有两个字段,@title 和@body,它们的权重分别为 100 和 15。当我搜索诸如“in”之类的小词时,我希望它将该搜索词的完全匹配排名更高,然后然后检查与“”的匹配in*|*in|*in*' 并将它们排名略低。有没有办法让您的搜索具有这种类型的特异性?

in”的示例结果:

  1. 印度美食
  2. 中间
  3. 关于拉丁语的文档

一些相关设置是:

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 没有显示为结果。我还搜索了 CowbCowbo,直到我输入 Cowboy 才收到预期的结果。有什么想法吗?


这个问题与this previous SO question 的思路相同,但我希望我已经就我的问题以及我试图保证解决方案的事情提供了更多细节。

【问题讨论】:

  • 我可以添加他们的任何其他项目来帮助人们回答这个问题吗?

标签: php search sphinx ranking infix-notation


【解决方案1】:

从形态上看,Cow 与 Cowboy 无关。

你可以通过两种方式解决它:

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

关于“in”和“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");

这应该可以解决问题。

【讨论】:

  • 我喜欢阅读看起来很优雅的解决方案。我将不得不稍微解决“牛仔”问题,但我真的很喜欢你关于如何解决“in”问题的建议。好建议! (也就是说......直到有人出现并以不同的方式告诉我;)当我假设它有效时,我会接受它作为正确答案。
【解决方案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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多