我的问题的快速总结,通配符运算符似乎没有返回我期望的结果。我正在针对某些Keyword
领域进行测试。
这是一个显示问题的示例
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
字段没有被标记。
PS:对于那些可能想知道我为什么要运行这个测试的人。我有一个带有一些数据库的电子商务网站,类别表有一些路径字段。例如,一个类别可能有这个路径“/1/2/3”,这意味着它是 id 为 3 的类别,父类别是索引 2 等等......
问题是当用户进行全文搜索并指定一个类别时,理想情况下我想返回该类别的结果,但也希望返回子类别,所以我需要一种 lucene 方式来执行路径 LIKE '/1/2%'。
另一种可能性是合并来自 SQL 查询和 lucene 命中的结果,如果可能的话,我想避免这种情况,因为它可能表现不佳。
如果您有任何想法,欢迎您。