Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [symfony][zend][lucene] obsługa polskich znaków (utf-8)
Forum PHP.pl > Forum > Gotowe rozwiązania
michalkjp
Nie wiem czy to rozwiązanie jest szerzej znane - nie znalazłem go podczas googlowania.

Używam lucene z zenda pod symfony w sposób przedstawiony w tutorialu jobeet - dzień 17.

Niestety przy zapytaniach zawierających polskie znaki lucene się wykrzaczało. Na sieci jest kilka rozwiązań tego problemu - poczynając od zmian w kodzie lucene (coś u mnie nie działało) przez odpowiednią konfigurację lucene z poziomu zenda (nie wiedziałem jak to zintegrować z symfony...). Niestety żadne ze znalezionych rozwiązań u mnie nie działało - dlatego przyjrzałem się temu jak jest konfigurowane lucene z poziomu propelowskiego pluginu sfLucenePlugin i tam znalazłem najlepsze działające rozwiązanie.

do funkcji rejestrującej zend'a

  1. static public function registerZend()
  2. {
  3. if (self::$zendLoaded)
  4. {
  5. return;
  6. }
  7.  
  8. set_include_path(sfConfig::get('sf_lib_dir').'/vendor'.PATH_SEPARATOR.get_include_path());
  9. require_once sfConfig::get('sf_lib_dir').'/vendor/Zend/Loader/Autoloader.php';
  10. Zend_Loader_Autoloader::getInstance();
  11. self::$zendLoaded = true;
  12. }


trzeba dodać Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('UTF-8');

  1. static public function registerZend()
  2. {
  3. if (self::$zendLoaded)
  4. {
  5. return;
  6. }
  7.  
  8. set_include_path(sfConfig::get('sf_lib_dir').'/vendor'.PATH_SEPARATOR.get_include_path());
  9. require_once sfConfig::get('sf_lib_dir').'/vendor/Zend/Loader/Autoloader.php';
  10. Zend_Loader_Autoloader::getInstance();
  11. Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('UTF-8');
  12. self::$zendLoaded = true;
  13. }


Mam nadzieję, że to rozwiązanie zaoszczędzi komuś trochę grzebania i szukania - przynajmniej mi bardziej się podoba niż czary mary z ustawianiem na sztywno kodowań w lucene winksmiley.jpg
trystero
Hej bardzo się ucieszyłem gdy znalazłem Twój post. Bo akurat też się od dłuższego czasu z tym męczę aby to zaczęło działać poprawnie.

Wprowadziłem zmiany zalecane przez Ciebie i na pierwszy rzut oka wydawało się, że wszystko jest w porządku. Tzn coś tam się w wynikach pojawiało wiec uznałem to za sukces, ponieważ wcześniej wyszukiwarka w ogóle nie zwracała żadnych wyników.

Jednak po dokładniejszej analizie zauważyłem, że Lucene przy szukaniu zaczął jednak popełniać błędy. Może podam przykład to będzie łatwiej zrozumieć jakie...

Przykład 1:
wpisuje w wyszukiwarce hasło: Żona
znajduje wszystkie rekordy które zawierają słowo ona. Zauważyłem ten błąd ponieważ miałem za dużo wyników na liście i z rzeczy które w ogóle nie miały hasła żona w indexie.

Przykład 2:
Ten jest bardziej ciekawy, wpisałem hasło: Książki
Lucene wyszukało mi oczywiście książki... ale... przy okazji znalazło hasła które nijak mają się do książek.
Doszedłem,że gdy występuje polski znaczek tak jak w tym haśle , to Lucene znajdzie
hasła które zawierają Ksi a także ki

Napisz czy też to u siebie zauważyłeś jeśli tak to czy i jak sobie z tym poradziłeś.

Pozdrawiam
michalkjp
Cytat(trystero @ 14.11.2010, 07:48:16 ) *
Napisz czy też to u siebie zauważyłeś jeśli tak to czy i jak sobie z tym poradziłeś.


Zrobiłem taki test - wpisałem sobie do pola "żona" i po wpisaniu w wyszukiwarce "żona" oraz "ona" dostaję w wyniku właściwy rekord, ale przy wpisaniu "kona" nie dostaję nic. Czyli jeśli dobrze rozumiem, to cały mechanizm gdzieś po prostu ignoruje polskie literki.

Nie radziłem sobie z tym problemem, bo w zastosowaniu w jakim używam lucene nie potrzebuję wielkiej dokładności wyszukiwania ani rozróżniania naszych literek (potrzebowałem tylko, żeby lucene się na nich nie wywalało) - nawet nie wiedziałem, że coś takiego występuje.

Niestety nie mogę pomóc, ponieważ nawet nie wiem, gdzie może leżeć problem. Proponuję zapytać na liście dyskusyjnej zend'a - deweloper zajmujący się kodem lucene w zend może znać rozwiązanie lub przynajmniej stwierdzi, że to nie u niego występuje problem. Wtedy będzie się trzeba udać bezpośrednio do deweloperów lucene. (Można jeszcze spróbować jak działają najnowsze wersje - może ktoś już usunął ten błąd?)

Pozdrawiam,
Michał

P.S. Jeśli dobrze widzę, to w indeksach, które zapisuje lucene i tak nie ma polskich znaków. Pole dodaje z ustawionym kodowaniem utf
$doc->addField(Zend_Search_Lucene_Field::UnStored('about_myself', $this->getAboutMyself(), 'utf-8'));
a w indeksie naszych krzaczków nie ma. Więc "żona" jest zapisywane w indeksie jako "ona".
CyberBob
Aby działało poprawnie musicie jeszcze zmienić domyślnego "porównywacza" (Zend_Search_Lucene_Analysis_Analyzer), poniższy kod u mnie działa poprawnie i nie występują problemy opisane przez michalkjp
  1. public static function registerZend() {
  2. if (self::$zendLoaded) {
  3. return;
  4. }
  5.  
  6. set_include_path(sfConfig::get('sf_lib_dir') . '/vendor' . PATH_SEPARATOR . get_include_path());
  7. require_once sfConfig::get('sf_lib_dir') . '/vendor/Zend/Loader/Autoloader.php';
  8. Zend_Loader_Autoloader::getInstance();
  9. self::$zendLoaded = true;
  10.  
  11. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
  12. new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive());
  13.  
  14. Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('UTF-8');
  15. }
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-2024 Invision Power Services, Inc.