2011-06-28 19 views
2

に私は現在、私はたTesseractを使用して、テキストファイルなどのコンテンツを格納するスキャンした文書を読んでいる個人的なプロジェクトに取り組んでいます。テキストファイルとjpegファイルの両方をWebディレクトリに保存し、mySQLデータベースを使用してそれらのリンクを維持します。このプロジェクトの目的は、主要な用語を検索し、画像を返すことができるようにすることです。のZend Luceneの - 検索テキストファイル

これまで、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; 
} 

あなたは私もパーサーを使用して試みたが、私は、少なくとも2つの文書が返されるべき知識を持つ私の検索を実行していますが、上記のいずれかの結果を返さないだろう見ることができるように。

例えば:+ボディ:丘+作成:[20110628 TO 20110328]

戻り値は、文書をゼロ。

あなたは、私は、すべての「/」を処分した見ることができるように「」私の日付(作成された)フィールドに ' - 'をつけて、それが検索のために適合することを保証するためにキーワード宣言を使用しましたが、それでも何も返されません。

また、私は、現在ではありません、そしてドキュメントへの重要な検索に含まれることを希望いくつかの用語があるとして使用されることを私自身のストップリストを適用する方法を知っていただきたいと思います。

自分自身のサーバーで作業していないため、アクセスが制限されているので、luceneまたはmySQLを使用するオプションはありません。DBで全文検索を使用する方が良いでしょうか?

ありがとうございます。

答えて

0

私は今、両方の用語を効果的に検索する方法を見つけることができました。それは暗黙ではないが、非常に簡単だった。以下のコード。 '+(ボディ::丘)+(作成:[20110628 TO 20110629])' 働く

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(); 
    } 
} 

これは、次のクエリを生成します。

は、私は今、すなわち、自分のストップリストを実装するのLuceneで使用されているストップリストを変更するといくつかの助けをしたいと思います。

乾杯