【问题标题】:Sphinx Search missing results狮身人面像搜索缺失的结果
【发布时间】:2015-10-15 12:13:34
【问题描述】:

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

  • 詹姆斯'吉姆'歌手
  • 吉姆亚伯拉罕
  • 吉姆·安德森
  • 吉姆·巴克斯
  • 吉姆·班农
  • ...

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

  • 詹姆斯'吉姆'歌手
  • 吉姆·詹森
  • 吉姆·贾木许
  • ...

如果我只搜索 Jim J,为什么我会错过“Ja”结果,但我会得到所有其他结果?

这里是源代码和索引代码:

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');
?>

有什么想法吗?

【问题讨论】:

    标签: symfony sphinx


    【解决方案1】:

    如果我只搜索 Jim J,为什么我会丢失“Ja”结果,但我会得到所有其他结果?

    搜索词“Jim”和“J”都匹配 Jim。所以Jim Abrahams 是有效的(它匹配两个查询词)。其他人并没有“失踪”,他们只是因为比赛太多而跌落谷底。

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

    但这将不允许使用中间名。允许这几个选项 http://sphinxsearch.com/docs/current.html#extended-syntax

    也许最简单的是严格的顺序运算符。

    Jim &lt;&lt; J

    或者如果想让人们输入姓氏,后跟姓氏,可以只使用接近甚至近邻


    编辑:再看一遍,发现您的代码实际上不会正确添加星号。它添加到每个空格分隔的标记中,即使它本身是一个运算符。

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

    更有效,更紧凑!

    或索引上的expand_keywords 选项以透明地执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      相关资源
      最近更新 更多