将搜索查询添加到应用程序
最后一步是写入一个允许用户针对索引运行搜索的表单。
1、右键单击 public 文件夹并选择 New -> File.
2、将文件命名为 search.php 并单击 Finish.
3、在文件中添加以下代码:
<html>
<head>
<title>Query</title>
</head>
<body>
<form action="/search.php" method="POST">
<label for="query">Search Query:</label>
<input type="text">
<input type="submit" value="Search!">
</form>
</body>
</html>
4、运行此脚本,Web 浏览器中的情况将与图 11 所示类似。
图 11. 搜索查询页
5、接下来,将以下 PHP 代码添加到 search.php 中:
<?php
/**
* This runs a search through an index already created.
*/
function search_index($path, $query) {
echo "Searching for [".$query."]</br>";
$file = new Java("java.io.File", $path, FALSE);
$file_directory = new JavaClass("org.apache.lucene.store.FSDirectory");
$directory = $file_directory->getDirectory($file);
$searcher = new Java("org.apache.lucene.search.IndexSearcher", $directory);
$analyser = new Java("org.apache.lucene.analysis.SimpleAnalyzer");
$parser = new Java("org.apache.lucene.queryParser.QueryParser",
"contents", $analyser);
$parsed_query = $parser->parse($query);
$hits = $searcher->search($parsed_query);
$count = $hits->length();
for ($index = 0; $index < $count; $index++) {
$document = $hits->doc($index);
echo $index.") ".$document->get("path")."</br>";
}
echo "</br>Finished searching [".$count." hits]</br>";
}
try {
$directory = dirname(__FILE__)."/../index";
define("INDEX_DIRECTORY", $directory);
$query = zget('/request/params/query');
if (strlen($query) > 0) {
search_index($directory, $query);
}
} catch (JavaException $exception) {
echo "Index search failed [".$exception->getMessage()."]</br>";
}
?>
和前面一样,此脚本使用了多个 Lucene 类。此脚本的要点在于,没有使用 index.php 之类的 IndexWriter 类,而使用了 IndexSearcher.其配置的目录与前面创建索引文件的目录相同。用户在该表单中输入的字符串将随后用于创建查询对象。Lucene QueryParser 提供了解析查询字符串的简单方法。
有了经过解析的查询后,脚本就准备好在 IndexSearcher 上运行搜索了。这将返回脚本所枚举的命中列表,显示每个项目的路径。
6、将 Web 浏览器指向 search.php 并输入一些搜索术语,如图 12 中所示。
图 12. 运行搜索查询的 Web 浏览器输出
在此示例中,找到匹配关键字“TSRM”和“int”的五个匹配项。Lucene 提供了强大的查询语法,能够支持各种搜索术语。关于可能的搜索查询的更多信息,请访问 Apache Lucene 站点。