Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][zf] Zend_Search_Lucene
Forum PHP.pl > Forum > PHP > Frameworki
kirex
Witam

Mam problem z wyszukiwaniem polskich znaków w bibliotece zenda Zend_Search_Lucene.
Ogólnie wyszukiwanie działa dosyć dobrze, problem jest tylko gdy w szukanej frazie znajdzie się choć jeden polski znak, wówczas Lucene zwraca mi 0 rekordów. Cała strona ustawiona jest na kodowanie utf-8, takie też podawane jest przy tworzeniu indexów przez luncene.

Tworzenie index'ów wygląda w sposób przedstawiony poniżej, dane pobierane są z bazy i w pętl
 indexowane.

  1. <?php
  2. $doc = new Zend_Search_Lucene_Document();
  3. $doc->addField(Zend_Search_Lucene_Field::Keyword('name', $posts[$i]['name'], 'utf-8'));
  4. ...
  5. $doc->addField(Zend_Search_Lucene_Field::UnStored('text', $posts[$i]['text'], 'utf-8'));
  6. $index->addDocument($doc);
  7. ?>


Szukanie zaś wygląda tak:
  1. <?php
  2. $query = new Zend_Search_Lucene_Search_Query_MultiTerm();
  3. $query->addTerm(new Zend_Search_Lucene_Index_Term($search, 'text'), true);
  4. $index = new Zend_Search_Lucene('./tmp/index');
  5. return $index->find($query);
  6. ?>


Wydaje mi się, że wszystko jest tak jak powinno być a mimo to nie działa.
Może ktoś spotkał się już z takim  problemem i go rozwiązał ? Jeśli tak to prosze o pomoc ?
Z góry dzięki.
Sabistik
Akurat nie miałem do czynienia jeszcze z tym komponentem, ale kiedyś był podobny temat: http://forum.php.pl/index.php?showtopic=64433
cyphelf
Dla potrzeb indeksowania ustaw analizer:

Kod
Zend_Search_Lucene_Analysis_Analyzer::setDefault(
    new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num()
);


A dla wyszukiwania:

Kod
Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('UTF-8');


Jedynym minusem jest wrażliwość tego analizera na wielkość znaków, ale z tym możesz sobie poradzić indeksując w dodatkowym polu całą treść przerobioną strtolower() a następnie robiąc to samo z zapytaniem wyszukiwania.
kirex
Sabistik od początku wzorowałem się na tym poście winksmiley.jpg

cyphelf dodałem analizer i domyślne kodowanie, a w dalszym ciągu brak efektu :/

Mam jeszcze pytanie czy metoda porównywania napisów w bazie ma znaczenie, u siebie mam "utf8_polish_ci".

Dodatkowo napiszę że:

w index.php jest:
mb_internal_encoding('UTF-8');
iconv_set_encoding('input_encoding', 'UTF-8');
iconv_set_encoding('output_encoding', 'UTF-8');
iconv_set_encoding('internal_encoding', 'UTF-8');

przy połączeniu z bazą wykonuję:
$adapter = parent::factory($adapterName, $config);
$adapter->query('SET NAMES utf8');
$adapter->query('SET CHARACTER SET utf8');

na każdej stronie w html'u jest:
<meta content="text/html; charset=utf-8" http-equiv="content-type" />

Tworzenie index'ów wygląda teraz tak:

indexowane.
  1. <?php
  2. Zend_Search_Lucene_Analysis_Analyzer::setDefault( new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num());
  3. $index = Zend_Search_Lucene::create('./tmp/index', true);
  4.  
  5. $postId = array();
  6.  
  7. for($i=0; $i < $postsSize; $i++)
  8. {
  9.    $doc = new Zend_Search_Lucene_Document();
  10.    $doc->addField(Zend_Search_Lucene_Field::Keyword('name', $posts[$i]['name'], 'utf-8'));
  11.  
  12.    ...
  13.                 
  14.    $doc->addField(Zend_Search_Lucene_Field::UnStored('text', $posts[$i]['text'], 'utf-8'));
  15.    $index->addDocument($doc);
  16. }
  17. ?>


Szukanie zaś wygląda tak:

  1. <?php
  2.    Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('UTF-8');
  3.    $query = new Zend_Search_Lucene_Search_Query_MultiTerm();
  4.    $query->addTerm(new Zend_Search_Lucene_Index_Term($search, 'text'), true);
  5.    $index = new Zend_Search_Lucene('./tmp/index');
  6.    return $index->find($query);
  7. ?>


 

co mu jeszcze nie pasi ?
cyphelf
Sprawdź zbudowany indeks programem Luke i zobacz czy na liście słowa kluczowe mają polskie znaki. Dowiemy się czy błąd jest w indeksowaniu czy wyszukiwaniu.
kirex
cyphelf dzieki za podpowiedź, sprawdziłem i faktycznie jest zonk.
Po sprawdzeniu tym programem okazało się, że czasem mam polską czcionke a niekiedy krzaki.
Zajrzałem do bazy i jest to samo. Dla testu wpisałem sobie polskie znaki przez pma i szukanie zaczeło smigać, a co za tym idzie mam coś zwalone przy dodawaniu rekordów do bazy, czasem dodaje dobrze a czasem z krzakami :/ przez to własnie lucene nie może wyszukiwać.

Tak więc dzięki cyphelf, lucene śmiga, czas szukać błędu w innym miejscu :/
Martio
Korzystam od dawna z Lucyny i niestety nie działa prawidłowo na polskich ogonkach. Najlepiej zabezpieczyć się prostym trickiem. Normalizuj polskie znaki na znaki bez ogonków ą => a, ś => s i takowe zdania, słowa indeksuj. Podobnie przy wyszukiwaniu. Ma to dodatkowy atut, że wyszuka i słowo "ślązak" i "slazak". Oczywiście, do dokumentu dodaję frazy do zaindeksowania, które są bez ogonków oraz przechowuje też dane z polskimi ogonkami, które wyświetlam w wynikach (tytuł i opis).
Juzef
Hm, chyba mam problem w jakiś sposób związany z polskimi znakami. Strona jest na kodowaniu iso8859-2, dodając dokument do indeksu podaję wejściowe kodowanie i w indeksie podejrzanym przez Luke wszystko jest na miejscu, polskie znaki ładne. I wyszukiwanie działa.
Ale dodawanie dokumentów do indeksu robi się coraz wolniejsze, im więcej ich już tam jest. Aktualnie wrzuciłem 5000 szt. i aktualizacja jednego trwa parę sekund. Wcześniej doszedłem do 10k i już były pady totalne.
Podejrzewałem, że może Lucene zżera pamięć (limit 64mb) ale jeśli jakiś błąd php się pojawi, to jest to przekroczenie czasu wykonania (30sek.) w klasach Lucene związanych z obsługą plików indeksu. Sam indeks jest poprawny chyba, bo przez Luke mogę go otworzyć i wyszukiwać.
Jedna rzecz jest dziwna: w indeksie jest 5k rekordów, zaś Luke pokazuje "Number of terms" = 14 000. Przy czym niektóre termy są poucinane na polskich znakach, czyli jeśli wejściowo było słowo "szkoła" to tam figuruje "szko". Czy to jest normalne? W dokumentacji piszą, że duża ilość termów może zamulać, ale czy to jest duża ilość? Pliki indeksu mają razem ledwo 2MB.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.