【发布时间】:2011-06-28 16:52:33
【问题描述】:
我目前正在从事一个个人项目,我正在使用 tesseract 读取扫描的文档并将内容存储为文本文件。我将文本文件和 jpeg 文件都保存在我的 web 目录中,并使用 mySQL 数据库维护它们之间的链接。该项目的目的是能够搜索关键术语并能够返回图像。
到目前为止,我已经能够使用 Zend Lucene 对文本文件进行索引,但是在处理搜索文档时遇到了很多问题,我的索引中的字段是: 图片的上传日期、正文(文本文件的内容)以及图片的 URI。
//Create document
$doc = new Zend_Search_Lucene_Document();
//Select database and get item to be indexed
mysql_select_db("database", $con);
$exampleSQL = "SELECT date_format(dateUploaded, '%Y%m%d') as formatted_date, imageLink, textLink
FROM `mappingTable`
WHERE imageLink='$item'";
$fileItem = mysql_fetch_assoc(mysql_query($exampleSQL));
//Add fields to document
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('URL',
$fileItem['imageLink']));
$doc->addField(Zend_Search_Lucene_Field::Keyword('created',
$fileItem['formatted_date']));
$contents = file_get_contents("/path/to/data/".$fileItem['textLink']);
$doc->addField(Zend_Search_Lucene_Field::UnStored('body',
$contents));
我认为以上所有内容都可以正常工作。 对于我的搜索,我打算按文本文件中的内容和图像上传到目录的日期进行搜索,因此我设计了以下查询,由于某种原因,这些查询一直未能按要求生成,特别是在按日期或搜索时按内容和日期。
if($queryType === "contentSearch"){
$term = new Zend_Search_Lucene_Index_Term($query, 'body');
$searchQuery = new Zend_Search_Lucene_Search_Query_Term($term);
try{
$hits = $index->find($searchQuery);
}
catch (Zend_Search_Lucene_Exception $ex) {
$hits = array();
}
} elseif ($queryType === "dateSearch"){
$searchQuery = '['.str_replace('/','',$fQuerydate)." TO ".str_replace('/','',$tQuerydate).']';
try{
$hits = $index->find($searchQuery);
}
catch (Zend_Search_Lucene_Exception $ex) {
$hits = array();
}
} elseif ($queryType === "bothSearch"){
$searchQuery = new Zend_Search_Lucene_Search_Query_MultiTerm();
$searchQuery->addTerm(new Zend_Search_Lucene_Index_Term($query, 'body'), true);
$searchQuery->addTerm(new Zend_Search_Lucene_Index_Term('['.str_replace('/','',$fQuerydate).' TO '.str_replace('/','',$tQuerydate).']', 'created'), true);
// $searchQuery = 'body:"'.$query.'" && created:'.$fQuerydate." TO ".$tQuerydate;
try{
$hits = $index->find($searchQuery);
} catch (Zend_Search_Lucene_Exception $ex) {
$hits = array();
}
} else {
$searchQuery = null;
}
如您所见,我什至尝试过使用解析器,但上述内容不会返回任何结果,尽管我在执行搜索时知道至少应该返回两个文档。
例如:+body:hill +created:[20110328 TO 20110628]
返回零个文档。
如你所见,我去掉了所有的 '/'、'.'和“-”在我的日期(创建)字段中,我使用了关键字声明来确保它符合搜索要求,但即使这样也不会返回任何内容。
我还想知道如何应用我自己的停用词列表,因为我希望在搜索中包含一些目前不存在但对文档很重要的词条。
由于我不在自己的服务器上工作并且访问权限有限,我别无选择,只能使用 lucene 或 mySQL,在我的数据库中使用全文搜索会更好吗?
提前致谢。
【问题讨论】:
标签: php full-text-search zend-search-lucene