Zend_Lucene ve wilcard operatör garabeti

0 Cevap php

Benim sorun hızlı bir özeti, joker operatör ben bekliyorum sonucunu döndürmek için görünmüyor. Bazı Keyword alanına karşı bu test ediyorum.

Burada sorunu gösteren bir örnek geliyor

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;
}

Beklediğim olacak gibi yerine bu son iki belgelerin bütün seti dönecektir

çıktı:

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

Yani burada benim soru neden lucene (bu durumda Zend_Lucene) I Keyword alanları tokenized değildir düşündüm ilk belgeleri eşleşir.

PS: olabilir ben bu testi kullanıyorum neden bilmek isteyenler için. Bazı veritabanı ile bir e-ticaret web sitesi var, kategori tabloda bazı yol alan var. Örneğin bir kategori o id 3 ve ana kategori ile bir kategori anlamına gelir, bu yolu '/ 1/2/3' olabilir endeksi 2 etc ...

Bir kullanıcı ideal ben bu kategori aynı zamanda çocukların kategorilerden sonuçları dönmek istiyorum, bir tam metin arama yapmak ve bir kategori belirleyebilirsiniz zaman sorunudur, bu yüzden bir yol gibi '/% 1/2' yapmanın bir lucene yol gerekir.

Bir diğer olasılık da kötü bir performans sergiliyor çünkü ben bu davayı önlemek istiyorum eğer mümkünse, bir SQL sorgusu ve lucene hits sonuçlarını birleştirmek olacaktır.

Eğer herhangi bir fikir varsa, bekliyoruz.

0 Cevap