如何正确使用 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 都可用时。
我的第一个 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 都可用时。