Zend lucene - 在文本文件中搜索

时间:2011-06-28 16:52:33

标签: php full-text-search zend-search-lucene

我目前正在开展个人项目,我正在使用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,我最好在我的数据库中使用全文搜索吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我现在设法找到有效搜索两种方式的方法。它虽然不含蓄,但非常简单。代码如下。

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"){



    $from = new Zend_Search_Lucene_Index_Term(str_replace('/','',$fQuerydate), 'created');

    $to   = new Zend_Search_Lucene_Index_Term(str_replace('/','',$tQuerydate), 'created');

    $searchQuery = new Zend_Search_Lucene_Search_Query_Range(
                    $from, $to, true // inclusive
                    );

    try{
        $hits = $index->find($searchQuery);
    }
    catch (Zend_Search_Lucene_Exception $ex) {
        $hits = array();
    }

}  elseif ($queryType === "bothSearch"){

    $searchQuery = new Zend_Search_Lucene_Search_Query_Boolean();

    $term  = new Zend_Search_Lucene_Index_Term($query, 'body');

    $subquery1 = new Zend_Search_Lucene_Search_Query_Term($term);

    $from = new Zend_Search_Lucene_Index_Term(str_replace('/','',$fQuerydate), 'created');

    $to   = new Zend_Search_Lucene_Index_Term(str_replace('/','',$tQuerydate), 'created');

    $subquery2 = new Zend_Search_Lucene_Search_Query_Range(
                    $from, $to, true // inclusive
                    );

    $searchQuery->addSubquery($subquery1, true  /* required */);
    $searchQuery->addSubquery($subquery2, true  /* optional */);

    try{
        $hits = $index->find($searchQuery);
    }
        catch (Zend_Search_Lucene_Exception $ex) {
        $hits = array();
    }
}

这会产生以下查询:'+(body:hill)+(created:[20110628 TO 20110629])''有效。

我现在想要一些帮助来实现我自己的停止列表,即更改lucene正在使用的停止列表。

干杯