2

Zend_Search_Lucene에서 색인 생성을 위해 아래 코드를 사용하고 있으며 기본 분석기를 숫자 값을 검색하도록 변경했습니다. Zend_Search_Lucene에서 @와 같은 특수 문자에 대한 검색어를 적용하는 방법은 무엇입니까?

public function executeIndexIT() { 

    $path = '/home/project/mgh/lib/'; 
    set_include_path(get_include_path() . PATH_SEPARATOR . $path);  
    require_once '/home/project/mgh/lib/Zend/Search/Lucene.php'; 

    Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive()); 

    $index = new Zend_Search_Lucene('/home/project/mgh/data/search_file/lucene.customer.index',true); 

    $filenames1='/home/project/mgh/web/cvcollection/data8/ASBABranches10546.pdf'; 
    $filenames2='/home/project/mgh/web/cvcollection/data2/manoj_new10550.pdf'; 

    $fc1=htmlentities("'".$this->ConvertPDF($filenames1)."'");  
    $fc2=htmlentities("'".$this->ConvertPDF($filenames2)."'"); 

    $doc = new Zend_Search_Lucene_Document(); 
    $doc->addField(Zend_Search_Lucene_Field::unIndexed('URL', $filenames1)); 
    $doc->addField(Zend_Search_Lucene_Field::text('contents',$fc1));  
    $index->addDocument($doc); 

    $doc = new Zend_Search_Lucene_Document(); 
    $doc->addField(Zend_Search_Lucene_Field::unIndexed('URL', $filenames2)); 
    $doc->addField(Zend_Search_Lucene_Field::text('contents',$fc2));  
    $index->addDocument($doc); 

    $index->commit(); 
    exit; 
} 

및 검색을위한 색인 후에 내가 코드 조각 아래 사용하고

:

public function executeSearchLucene() { 

    $path = '/home/project/mgh/lib/'; 
    set_include_path(get_include_path() . PATH_SEPARATOR . $path); 
    require_once('Zend/Search/Lucene.php'); 

    Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive()); 

    $hits = array(); 
    $txtSearch='@'; 
    try { 
     $query = Zend_Search_Lucene_Search_QueryParser::parse($txtSearch); 
    } catch (Zend_Search_Lucene_Search_QueryParserException $e) { 
     echo "Query syntax error: " . $e->getMessage() . "\n"; 
    } 

    $index = new Zend_Search_Lucene('/home/project/mgh/data/search_file/lucene.customer.index'); 

    //**added on 29 may**/  
    $results = $index->find($query); 
    echo count($results); 
    foreach ($results as $result) { 
     echo "<pre>"; 
     var_dump($result->URL); 
    } 
    exit; 
} 

여기 $fc2 몇 이메일 주소를 포함하고 나는 그들을 위해 검색해야합니다. 하지만 0 히트를 얻고 있습니다.

또는 !과 같은 문자를 검색하는 방법 Zend_Search_Lucene?

답변

0

토큰 화되지 않았으므로 keyword 필드에서만 작동합니다. 따라서 예와 같이 전자 메일 (또는 특수 문자가있는 다른 텍스트)을 별도의 데이터로 제공했는지 확인해야합니다. 쿼리 파서 Zend_Search_Lucene_Search_Query_Preprocessing_Term 객체로 변환하기 때문에 또한 당신은 쿼리 파서를 사용할 수 없습니다

echo('<pre>'); 
var_dump(Zend_Search_Lucene_Search_QueryParser::parse("*@*")); 
var_dump(Zend_Search_Lucene_Search_QueryParser::parse("@")); 
echo('</pre>'); 
die(); 

어떤 문서에 따라 :

실제로 쿼리 실행에 관여하지 않습니다

작동 코드가 아래와 같습니다.

$index = Zend_Search_Lucene::create('/tmp/index'); 

$doc1 = new Zend_Search_Lucene_Document; 
$doc1->addField(Zend_Search_Lucene_Field::text('title', 'Some Title Here')) 
    ->addField(Zend_Search_Lucene_Field::keyword('content', '[email protected]')); 
$index->addDocument($doc1); 

$doc2 = new Zend_Search_Lucene_Document; 
$doc2->addField(Zend_Search_Lucene_Field::text('title', 'Another title Here')) 
    ->addField(Zend_Search_Lucene_Field::keyword('content', 'test!test.com')); 
$index->addDocument($doc2); 

$index->commit(); 

Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0); 
$term = new Zend_Search_Lucene_Index_Term("*@*"); 
$query = new Zend_Search_Lucene_Search_Query_Wildcard($term); 

$hits = $index->find($query); 
echo('<pre>'); 
var_dump(count($hits)); 
foreach($hits as $hit) { 
    var_dump($hit->title); 
    var_dump($hit->content); 
} 
echo('</pre>'); 

Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0); 
$term = new Zend_Search_Lucene_Index_Term("*!*"); 
$query = new Zend_Search_Lucene_Search_Query_Wildcard($term); 

$hits = $index->find($query); 
echo('<pre>'); 
var_dump(count($hits)); 
foreach($hits as $hit) { 
    var_dump($hit->title); 
    var_dump($hit->content); 
} 
echo('</pre>'); 

die(); 

희망적입니다. Zend Lucene 구현에는 많은 한계가 있습니다.

관련 문제