В кратком изложении моей проблемы, подстановочный оператор, похоже, не возвращает ожидаемого результата.Я проверяю это против некоторого поля 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», что означает, что это категория с идентификатором 3, а родительская категория - индекс 2 и т. Д. *
Проблема заключается в том, что пользователь вводит полный текстискать и указывать категорию, в идеале я хочу вернуть результаты из этой категории, но также и дочерние категории, поэтому мне нужен lucene способ выполнения пути LIKE '/ 1/2%'.
Еще одна возможность состояла бы в том, чтобы объединить результаты запроса SQL и попаданий в lucene, если возможно, я бы хотел избежать этого случая, потому что он может работать плохо.
Если у вас есть идеи, добро пожаловать.