Sphinx搜索缺失的结果

时间:2015-10-15 12:13:34

标签: symfony sphinx

我正在使用Sphinx和Symfony2来搜索我的数据库中的人。
奇怪的行为是: 我搜索 Jim J ,结果是:

  • 詹姆斯'吉姆'歌手
  • Jim Abrahams
  • 吉姆安德森
  • Jim Backus
  • Jim Bennon
  • ...

如果我搜索 Jim Ja ,结果是:

  • 詹姆斯'吉姆'歌手
  • Jim Jansen
  • Jim Jarmusch
  • ...

为什么我错过了" Ja"结果,如果我只是寻找吉姆J,但我得到所有其他人?

这是源代码和索引代码:

source peopleautocomplete {

sql_query           = SELECT id, firstName, lastName, pseudonym FROM Person

sql_attr_string     = pseudonym
sql_attr_string     = firstName
sql_attr_string     = lastName
}

index peopleautocomplete
{
source              = peopleautocomplete
path                = /var/lib/sphinxsearch/data/peopleautocomplete
docinfo             = extern
charset_type        = utf-8
min_word_len        = 2
enable_star         = 1
min_prefix_len      = 1
}

和php代码:

<?php
    $q = $request->query->get('q');
    $aq = explode(' ', $q);
    if (strlen($aq[count($aq) - 1]) < 2) {
        $query = $q;
    } else {
        $query = $q . '*';
    }
    $result = $this->_getSearchEngine()->searchEx($query, 'peopleautocomplete');
?>

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

  

为什么我错过了&#34; Ja&#34;结果,如果我只是寻找吉姆J,但我得到所有其他人?

两个搜索词&#39; Jim&#39;和&#39; J&#39;吉姆。所以Jim Abrahams有效(它匹配两个查询词)。其他人并不缺少&#39;因为这么多比赛,他们只是从底部掉了下来。

可以使用"Jim J"将其作为短语进行搜索(您的代码应添加所需的星标) - 需要两个匹配的单词。

但那会让中间人不知所措。允许这两个选项 http://sphinxsearch.com/docs/current.html#extended-syntax

也许最简单的是严格的订单运营商。

Jim << J

或者如果想让人们进入Surname,然后是姓氏,可以只使用邻近或甚至NEAR

编辑:再看,看你的代码实际上不会正确添加星星。它为每个空格分隔了令牌,即使它本身就是一个操作员。

<?php $query = preg_replace('/(\w{2,}\b)/','$1*',$query); 

更有效,更紧凑!

索引上的

expand_keywords选项可以透明地执行此操作。