내 문제에 대한 간단한 요약 과일드 카드 연산자는 예상 한 결과를 반환하지 않는 것 같습니다. 일부 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 히트의 결과를 병합하는 것일 수 있습니다. 가능하다면 성능이 좋지 않을 수 있으므로이 경우를 피하고 싶습니다.
아이디어가 있으시면 언제든지 환영합니다.
답변 해 주셔서 감사합니다. 나는 루신이 분석기 때문에 번호를 제거하고있는 것을 본다. 나는/단어 문자를 바꿔서 아무것도 바꾸지 않는 이유를 정말로 설명 할 수 없지만, 키워드 필드는 올바르게 토큰 화되지 않아야합니까? – RageZ
키워드 입력란이 토큰 화되지 않았습니다. 사실입니다. 하지만 검색어는입니다. – rik
좋은 점, 설명해줍니다. – RageZ