2010-12-02 2 views
0

내 문제에 대한 간단한 요약 과일드 카드 연산자는 예상 한 결과를 반환하지 않는 것 같습니다. 일부 Keyword 필드에 대해이 문제를 테스트하고 있습니다. 여기Zend_Lucene 및 wilcard 연산자 이상한

문제를 보여주는 샘플을 제공

include 'Zend/Loader/Autoloader.php'; 
$autoloader = Zend_Loader_Autoloader::getInstance(); 
$autoloader->setFallbackAutoloader(true); 


Zend_Search_Lucene_Analysis_Analyzer::setDefault(
    new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive()); 
@mkdir('/tmp/test-lucene'); 
$index = Zend_Search_Lucene::create('/tmp/test-lucene'); 
$doc = new Zend_Search_Lucene_Document(); 
$doc->addField(Zend_Search_Lucene_Field::Keyword('path', 'root/1/2/3')); 
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', 'The lazy fox jump over the dog bla bla bla')); 
$index->addDocument($doc); 


$doc = new Zend_Search_Lucene_Document(); 
$doc->addField(Zend_Search_Lucene_Field::Keyword('path', 'root/1')); 
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', 'The lazy fox jump over the dog bla bla bla')); 
$index->addDocument($doc); 

$doc = new Zend_Search_Lucene_Document(); 
$doc->addField(Zend_Search_Lucene_Field::Keyword('path', 'root/3/2/1')); 
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', 'The lazy fox jump over the dog bla bla bla')); 
$index->addDocument($doc); 

$doc = new Zend_Search_Lucene_Document(); 
$doc->addField(Zend_Search_Lucene_Field::Keyword('path', 'root/3/2/2')); 
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', 'The lazy fox jump over the dog bla bla bla')); 
$index->addDocument($doc); 

$hits = $index->find('path:root/3/2*'); 
foreach($hits as $hit){ 
    $doc = $hit->getDocument(); 
    echo $doc->getFieldValue('path') . PHP_EOL; 
} 

이 대신 내가 기대했던 것처럼 마지막 두 문서의 전체 집합을 반환합니다

출력 : 그래서 여기

root/1/2/3 
root/1 
root/3/2/1 
root/3/2/2 

내 질문 왜 lucene (그 경우에는 Zend_Lucene) 첫 번째 문서와 일치, 나는 Keyword 필드가 토큰 화되지 않은 줄 알았는데.

추 신 :이 테스트를 실행하는 이유를 알고 싶어하는 사람들을위한 것입니다. 일부 데이터베이스가있는 전자 상거래 웹 사이트가 있고 카테고리 테이블에 경로 필드가 있습니다. 예를 들어 카테고리에는 '/ 1/2/3'경로가있을 수 있습니다. 즉, ID가 3이고 상위 카테고리가 인덱스 2 인 경로를 의미합니다.

문제는 사용자가 전체 텍스트 검색을 수행하고 카테고리를 지정하면 이상적으로 해당 카테고리의 결과뿐만 아니라 어린이 카테고리도 반환하기를 원하므로 '/ 1/2 %'와 같은 경로를 사용하는 방법이 필요합니다.

다른 가능성은 SQL 쿼리와 lucene 히트의 결과를 병합하는 것일 수 있습니다. 가능하다면 성능이 좋지 않을 수 있으므로이 경우를 피하고 싶습니다.

아이디어가 있으시면 언제든지 환영합니다.

답변

1

Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive를 사용하고 슬래시를 경로에 나타나지 않지만 Zend_Search_Lucene의 단어 문자 인 바꿉니다. 나는 독일 ß를 사용했다.

include 'Zend/Loader/Autoloader.php'; 
$autoloader = Zend_Loader_Autoloader::getInstance(); 
$autoloader->setFallbackAutoloader(true); 

Zend_Search_Lucene_Analysis_Analyzer::setDefault(
    new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive()); 
@mkdir('/tmp/test-lucene'); 
$index = Zend_Search_Lucene::create('/tmp/test-lucene'); 

foreach (array('root/1/2/3', 'root/1', 'root/3/2/1', 'root/3/2/2') as $path) { 
    $path = str_replace('/', 'ß', $path); 
    $doc = new Zend_Search_Lucene_Document(); 
    $doc->addField(Zend_Search_Lucene_Field::Keyword('path', $path)); 
    $index->addDocument($doc); 
} 

$hits = $index->find(str_replace('/', 'ß', 'path:root/3/2*')); 
foreach($hits as $hit){ 
    echo str_replace('ß', '/', $hit->getDocument()->getFieldValue('path')) . PHP_EOL; 
} 
+0

답변 해 주셔서 감사합니다. 나는 루신이 분석기 때문에 번호를 제거하고있는 것을 본다. 나는/단어 문자를 바꿔서 아무것도 바꾸지 않는 이유를 정말로 설명 할 수 없지만, 키워드 필드는 올바르게 토큰 화되지 않아야합니까? – RageZ

+0

키워드 입력란이 토큰 화되지 않았습니다. 사실입니다. 하지만 검색어는입니다. – rik

+0

좋은 점, 설명해줍니다. – RageZ