代码之家  ›  专栏  ›  技术社区  ›  Tiago

从sphinx(在php中)检索信息的最佳方法是什么?

  •  4
  • Tiago  · 技术社区  · 15 年前

    我是斯芬克斯的新手,我正在一个新网站上建立它。 它工作得很好,当我用 搜索 在控制台中,一切正常。

    使用phapi和搜索结果,我也得到了相同的结果。但它只为找到的行提供ID和权重。例如,是否有某种方法可以将一些文本字段与“匹配”哈希组合在一起?

    如果无法做到这一点,是否有人对如何按照sphinx权重排序(同时搜索所有记录)从数据库(SQL)中检索记录有一个好主意?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Ty W    15 年前

    您可以在订单中使用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)
    
        2
  •  4
  •   Tiago    15 年前

    是的,斯芬克斯没有带来结果。 但我发现了一种简单的方法,可以使用in()子句对查询进行重新排序,从而将所有内容组合在一起。

    发火

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

    只需将结果与其表中的ID进行索引:

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

    斯芬克斯的匹配结果很容易重新排序:

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

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

    它几乎是帕特的答案,但只有一个循环。我想,在大的结果上会有一些不同。

        3
  •  0
  •   alex shishkin    15 年前

    不幸的是,sphinx没有返回匹配的字段,只返回其ID(sphinx索引不包含数据-只包含来自数据的哈希)。 关于这个问题,你可以在sphinxsearch.com论坛上找到。

        4
  •  0
  •   pat    15 年前

    正如亚历克斯所说,斯芬克斯不会返回这些信息。您将不得不自己使用这些ID来查询数据库——只需遍历每个ID,取出相关数据,并将结果按权重顺序保存。要在一个查询中完成这一切,您可以尝试以下方法(psuedo代码-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;