如何正确使用 snippet() 函数?

How correctly to use the snippet() function?

我的第一个 Sphinx 应用程序即将运行! 我成功地将路径、标题、内容保存为索引中的属性!

但我决定从 AP 转到 SphinxQL PDO: 我找到了 snippets() 示例 thanks to barryhunter again 但不知道如何使用它。

这是我的工作代码,除了 snippets():

 $conn = new PDO('mysql:host=ununtu;port=9306;charset=utf8', '', '');
  if(isset($_GET['query']) and strlen($_GET['query']) > 1)
  {
        $query = $_GET['query'];
        $sql= "SELECT * FROM `test1` WHERE MATCH('$query')";
        foreach ($conn->query($sql) as $info) {

                //snippet. don't works
                $docs = array();

                foreach () {
                    $docs[] = "'".mysql_real_escape_string(strip_tags($info['content']))."'";
                }

                $result = mysql_query("CALL SNIPPETS((".implode(',',$docs)."),'test1','" . mysql_real_escape_string($query) . "')",$conn);
                $reply = array();

                while ($row = mysql_fetch_array($result,MYSQL_ASSOC)) {
                    $reply[] = $row['snippet'];
                }



                // path, title out. works
                $path = rawurlencode($info["path"]); $title = $info["title"];
                $output =  '<a href=' . $path . '>' . $title . '</a>'; $output = str_replace('%2F', '/', $output);
                print( $output . "<br><br>");
        }
}

我从 Sphinx 索引中得到了这样的结构:

Array
(
    [0] => Array
        (
            [id] => 244
            [path] => DOC7000/zdorovie1.doc
            [title] => zdorovie1.doc
            [content] => Stuff content

我对一系列文档有点困惑。 我也没有看到建议:“所以它应该更有效率,只编译文档并调用 buildExcepts 一次。 但更有趣的是,当您从 sphinx 属性获取文本时,可以在主查询中使用 SNIPPETS() sphinx 函数(在 setSelect() 中!)。所以你不必收到全文,只需发回给 sphinx。即狮身人面像将在内部从属性中获取文本。更有效率! “ 请告诉我我应该如何更改代码来为文档数组调用 snippet() 一次,但输出路径(link),每个文档的标题。

因为你的数据来自 sphinx,所以你可以只使用 SNIPPET() 函数(不是 CALL SNIPPETS()!)

$query = $conn->quote($_GET['query']);
$sql= "SELECT *,SNIPPET(content,$query) AS `snippet` FROM `test1` WHERE MATCH($query)";
foreach ($conn->query($sql) as $info) {
    $path = rawurlencode($info["path"]); $title = $info["title"];
    $output =  '<a href=' . $path . '>' . $title . '</a>'; $output = str_replace('%2F', '/', $output);
    print("$output<br>{$info['snippet']}<br><br>");
}

突出显示的文本就在主查询中,不需要将数据捆绑起来发送到 sphinx。

还表明您应该转义来自用户的原始查询。

(您找到的示例就是这样做的,因为全文来自 MySQL - 而不是 sphinx - 所以它别无选择,只能来回发送数据!)

为了完整起见,如果真的想使用 CALL SNIPPETS() 应该是

<?php

$query =$conn->quote($_GET['query']);

//make query request
$sql= "SELECT * FROM `test1` WHERE MATCH($query)";
$result = $conn->query($sql);
$rows = $result->fetchAll(PDO::FETCH_ASSOC);

//build list of docs to send
$docs = array();
foreach ($rows as $info) {
    $docs[] = $conn->quote(strip_tags($info['content']));
}

//make snippet reqest
$sql = "CALL SNIPPETS((".implode(',',$docs)."),'test1',$query)";

//decode reply
$reply = array();
foreach ($conn->query($sql) as $row) {
    $reply[] = $row['snippet'];
}

//output results using $rows, and cross referencing with $reply
foreach ($rows as $idx => $info) {

    // path, title out. works
    $path = rawurlencode($info["path"]); $title = $info["title"];
    $output =  '<a href=' . $path . '>' . $title . '</a>'; $output = str_replace('%2F', '/', $output);
    $snippet = $reply[$idx];

    print("$output<br>$snippet<br><br>");
}

显示将行放入一个数组中,因为需要两次遍历数据。一次到 'bundle' 向上 docs 数组发送。然后再次显示规则,当 $rows 和 $reply 都可用时。