Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zend_Search_Lucene
Forum PHP.pl > Forum > PHP > Frameworki
Martio
Kiedyś był problem z polskimi znakami. Czy wiecie może czy ten błąd już poprawiono? W manualu nic nie jest napisane.
konys
Osobiście miałem niewielki problem z indeksowaniem niektórych polskich liter (ż,ś, może coś jeszcze) (korzystam z UTF-8). Poprawiłem w pliku Zend\Search\Lucene\Analysis\Analyzer\Common\Text.php funkcję

  1. <?php
  2. public function reset()
  3. {
  4. $this->_position = 0;
  5.  
  6. if ($this->_input === null) {
  7. return;
  8. }
  9.  
  10. // convert input into ascii
  11. $this->_input = iconv($this->_encoding, 'UTF-8'/*'ASCII//TRANSLIT'*/, $this->_input);
  12. $this->_encoding = 'UTF-8'/*'ASCII'*/;
  13. }
  14. ?>


oraz w Zend\Search\Lucene\Search\QueryLexer.php zmieniłem 346 linijkę (w funkcji tokenize())
  1. <?php
  2. $strLength = iconv_strlen($inputString, 'UTF-8'/*$encoding*/);
  3. ?>


Na szybkiego wydaje się działać, ale nie dałbym temu kodowi 100% gwarancji...

____________________________________________________
Znalazłem trochę lepsze rozwiązanie:

w bootstrap file dodaj następujące ustawienia:
  1. <?php
  2. mb_internal_encoding('UTF-8');
  3. iconv_set_encoding('input_encoding', 'UTF-8');
  4. iconv_set_encoding('output_encoding', 'UTF-8');
  5. iconv_set_encoding('internal_encoding', 'UTF-8');
  6. ?>


po wystartowaniu bazy:

  1. <?php
  2. $db->query('SET CHARACTER SET utf8');
  3. ?>


w pliku Zend/Search/Lucene/Search/QueryParser.php zmień wartość atrybutu $_defaultEncoding
  1. <?php
  2. private $_defaultEncoding = 'UTF-8';
  3. ?>


i przy indeksowaniu danych podawaj w jakim chcesz je wprowadzić kodowaniu - np.
  1. <?php
  2. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $contents, 'UTF-8'));
  3. ?>


Powinno działać
Martio
Wszystko OK, należy tylko stosować funkcje do stringów z biblioteki Multibyte String, a więc np. zamiast strtolower zastosować mb_strtolower.
dafi
co do polskich znaków to rozwiązaniem jest zastąpienie defaultowego analysera który działa na zestawie znaków ASCII takim który działa z utf-8.

trzeba to wykonać zarówno przed indexowaniem jaki i wyszukiwaniem poleceniem :

  1. Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive());


dla wyników które nie mają uwzględniać wielkości znaków lub :
  1. Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());


dla tych co mają je uwzględniać.

Ewentualnie można jeszcze poprawić "podświetlanie wyników" by poprawnie obsługiwało polskie znaki.
Znowu winien jest analyser a dokładnie jego wywołanie bez parametru kodowania.

plik: Zend_Search_Lucene_Document_Html metoda: highlightExtended()

zamienić :
  1. $wordsToHighlightList[] = $analyzer->tokenize($wordString);

na:
  1. $wordsToHighlightList[] = $analyzer->tokenize($wordString,'UTF-8');




[ZF ver: 1.10.3]
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.