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

时间:2018-06-20 10:35:48

标签: sphinx

我的第一个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()!中)。因此,您不必接收全文,只需要发送回狮身人面像。即,狮身人面像将从内部从属性获取文本。更有效率! ” 请告诉我如何更改docs数组一次调用snippet()的代码,但要更改每个文档的输出路径(链接)和标题。

1 个答案:

答案 0 :(得分:0)

好吧,因为您的数据来自狮身人面像,所以您只能使用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>");
}

突出显示的文本就在主查询中,不需要将数据备份捆绑在一起发送到狮身人面像。

还显示您应该逃避用户的原始查询。

(您发现的示例这样做了,因为全文来自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>");
}

显示将行放入数组中,因为需要通过数据两次读取。一次“捆绑”文档数组以发送。然后,当同时有$ rows和$ reply都可用时,再次以清晰的方式显示规则。