Sphinx PHP搜索

15

我正在使用 Sphinx 进行搜索,但结果非常奇怪。希望能得到帮助。

例如,如果我键入“50”,我会得到:

  • 50 Cent
  • 50 Lions
  • 50 Foot Wave 等

这很好,但是当我搜索“50 Ce”时,我会得到:

  • Ryczące Dwudziestki
  • Spisek
  • Bernhard Gal
  • Cowabunga Go-Go

还有其他一些奇怪的结果。当我搜索“50 Cent”时,正确的结果位于顶部,然后下面是随机的结果。有什么想法吗?

PHP 代码:

$query = $_GET['query'];

if (!empty($query))
{
 $sphinx->SetMatchMode(SPH_MATCH_ALL);
 $sphinx->AddQuery($query, 'artists');
 $sphinx->AddQuery($query, 'variations');

 $sphinx->SetFilter('name', array(3));

 $sphinx->SetLimits(0, 10);

 $result = $sphinx->RunQueries();

 echo '<pre>';

 switch ($result)
 {
  case false:
   echo 'Query failed: ' . $sphinx->GetLastError() . "\n";
   break;
  default:
   if ($sphinx->GetLastWarning())
   {
    echo 'WARNING: ' . $sphinx->GetLastWarning() . "\n";
   }

   if (is_array($result[0]['matches']) && count($result[0]['matches']))
   {
    foreach ($result[0]['matches'] as $value => $info)
    {
     $artist = artistDetails($value);
     echo $artist['name'] . "\n";
    }
   }
 }
}

Sphinx索引和源代码:

source artists
{
 type     = mysql

 sql_host    = localhost
 sql_user    = user
 sql_pass    = pass
 sql_db     = db
 sql_port    = 3300

 sql_query    = \
  SELECT \
    id, name \
  FROM artists;

 #UNIX_TIMESTAMP(time)
 #sql_attr_uint   = group_id
 #sql_attr_timestamp  = time

 sql_query_info   = SELECT id,name FROM artists WHERE id=$id
}

index artists
{
 source     = artists
 path     = /var/sphinx/artists
 docinfo     = extern
 charset_type   = utf-8
}
1个回答

21

你需要使用min_prefix_len索引配置选项告诉sphinx,你希望它对部分单词进行索引和匹配。您还可能需要将enable_star设置为1。

http://www.sphinxsearch.com/docs/current.html#conf-min-prefix-len

index artists
{
 source     = artists
 path     = /var/sphinx/artists
 docinfo     = extern
 charset_type   = utf-8
 min_prefix_len   = 2
 enable_star   = 1
}

启用前缀索引后,您将能够搜索类似于“50 Ce*”这样的内容以获取部分单词匹配。如果您希望允许部分单词匹配而无需要求用户自己添加*,则可能需要在将其传递到 Sphinx 之前以编程方式修改搜索字符串。


1
这太棒了。我不确定这只适用于较新版本的Sphinx还是所有版本,但您可能根本不需要设置enable_star = 1。我没有修改默认值,我的查询结果仍然一样。此外,对于大多数用例(而非此用例),我认为将min_prefix_len设置小于4可能是不必要的。如果有人能在这里评论性能,我将不胜感激。 - Josh Smith
忽略我关于 min_prefix_len 的说法。对于搜索自动完成,将其设置为2会有很大的帮助。 - Josh Smith
你好,我是一个新手,正在使用Linux服务器学习Sphinx。但是我遇到了111错误。 - Karthik
1
@KSReddy:错误代码111表示连接错误。检查您提供给Sphinx的端口可能是错误的。务必检查一下。如果您使用的是Sphinx API,则通常使用9312。当我在处理这个问题时,我也被困扰了将近3个小时。 - Nishant Shrivastava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接