2

私は現在、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;
}

ご覧のとおり、パーサーを使用してみましたが、少なくとも 2 つのドキュメントが返される必要があるという知識で検索を実行していますが、上記の結果は返されません。

例: +body:hill +created:[20110328 TO 20110628]

ゼロのドキュメントを返します。

ご覧のとおり、すべての「/」、「.」を削除しました。および「-」を日付 (作成) フィールドに入力し、キーワード宣言を使用して検索に準拠していることを確認しましたが、それでも何も返されません。

また、検索に含めたい用語がいくつかあるため、独自のストップ リストを使用する方法を知りたいのですが、現在は含まれていませんが、ドキュメントにとって重要です。

私は自分のサーバーで作業しておらず、サーバーへのアクセスが制限されているため、lucene または mySQL を使用するしかありません。DB で全文検索を使用したほうがよいでしょうか?

前もって感謝します。

4

1 に答える 1

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 で使用されているストップリストの変更について助けてほしいと思います。

乾杯

于 2011-06-29T10:39:02.660 に答える