【问题标题】:Whats the best way to retrieve information from Sphinx (in PHP)?从 Sphinx 检索信息的最佳方法是什么(在 PHP 中)?
【发布时间】:2010-10-11 12:21:29
【问题描述】:

我是 sphinx 的新手,我正在一个新网站上设置它。 它工作正常,当我在控制台中使用 search 进行搜索时,一切正常。

使用 PHP api 和搜索,也给了我相同的结果。但它只给了我找到的行的 ID 和权重。例如,有什么方法可以将一些文本字段与“匹配”哈希结合起来?

如果没有办法做到这一点,有没有人知道如何以狮​​身人面像权重排序顺序从数据库(sql)中检索记录(同时搜索所有记录)?

【问题讨论】:

    标签: php mysql database full-text-search sphinx


    【解决方案1】:

    是的,斯芬克斯不会带来结果。 但我发现了一种使用 IN() 子句重新排序查询的简单方法,将所有内容放在一起。

    查询某事

    SELECT * FROM table WHERE id IN(id_list... )
    

    只是索引结果,它们的 id 在表中:

    while ($row = mysql_fetch_objects)
       $result[$row->id] = $row; 
    

    并且从 sphinx 获得匹配结果,很容易重新排序:

    $ordered_result = array();
    foreach ($sphinxs_results['matches'] as $id => $content)
       $ordered_result[] = $result1[$id];
    

    如果您的 $sphinxs_results 顺序正确,这将起作用。

    它几乎是 pat 的答案,但循环次数更少。我猜可以对大结果产生一些影响。

    【讨论】:

      【解决方案2】:

      您可以在 ORDER BY 中使用 mysql FIELD() 函数调用来确保所有内容都符合 sphinx 指定的顺序。

      
      $idlist = array();
      foreach ( $sphinx_result["matches"] as $id => $idinfo ) {
          $idlist[] = "$id";
      }
      $ids = implode(", ", $idlist);
      
      SELECT * FROM table WHERE id IN ($ids) ORDER BY FIELD(id, $ids)
      

      【讨论】:

      • 当 IN() 列表很大时,这可能会非常慢,因为 MySQL 通常会将其转换为范围扫描。我建议创建一个临时表并加入它。
      【解决方案3】:

      不幸的是,sphinx 没有返回匹配的字段,只返回它的 id(sphinx 索引不包含数据 - 仅来自数据的哈希)。 您可以在 sphinxsearch.com 论坛上发布有关此问题的信息。

      【讨论】:

        【解决方案4】:

        正如 Alex 所说,Sphinx 不会返回该信息。您必须使用 ID 自己查询数据库 - 只需遍历每个 ID,获取相关数据,保持结果按权重顺序排列。要在一个查询中完成所有操作,您可以尝试以下操作(伪代码 - PHP 不是我选择的语言):

        results = db.query("SELECT * FROM table WHERE id IN (%s)", matches.join(", "));
        ordered_results = [];
        
        for (match in matches) {
          for (result in results) {
            if (result["id"] == match) {
              ordered_results << result;
            }
          }
        }
        
        return ordered_results;
        

        【讨论】:

          猜你喜欢
          • 2016-12-07
          • 2015-04-08
          • 2011-06-29
          • 2015-10-24
          • 2014-07-14
          • 2013-05-02
          • 2010-09-15
          • 1970-01-01
          • 2011-05-25
          相关资源
          最近更新 更多