我的第一个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()的代码,但要更改每个文档的输出路径(链接)和标题。
答案 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都可用时,再次以清晰的方式显示规则。