Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][zf] Zend_Search_Lucene, Wyszukiwanie z polskimi znakami
kirex
post
Post #1





Grupa: Zarejestrowani
Postów: 16
Pomógł: 4
Dołączył: 3.03.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
Sabistik
post
Post #2


Administrator wortalu


Grupa: Przyjaciele php.pl
Postów: 960
Pomógł: 39
Dołączył: 21.10.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Akurat nie miałem do czynienia jeszcze z tym komponentem, ale kiedyś był podobny temat: http://forum.php.pl/index.php?showtopic=64433
Go to the top of the page
+Quote Post
cyphelf
post
Post #3





Grupa: Zarejestrowani
Postów: 68
Pomógł: 1
Dołączył: 27.03.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
lorem ipsum : polska społeczność zend framework
Go to the top of the page
+Quote Post
kirex
post
Post #4





Grupa: Zarejestrowani
Postów: 16
Pomógł: 4
Dołączył: 3.03.2008

Ostrzeżenie: (0%)
-----


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 ?

Ten post edytował kirex 4.03.2008, 12:41:01
Go to the top of the page
+Quote Post
cyphelf
post
Post #5





Grupa: Zarejestrowani
Postów: 68
Pomógł: 1
Dołączył: 27.03.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
lorem ipsum : polska społeczność zend framework
Go to the top of the page
+Quote Post
kirex
post
Post #6





Grupa: Zarejestrowani
Postów: 16
Pomógł: 4
Dołączył: 3.03.2008

Ostrzeżenie: (0%)
-----


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 :/

Ten post edytował kirex 6.03.2008, 15:47:53
Go to the top of the page
+Quote Post
Martio
post
Post #7





Grupa: Zablokowani
Postów: 167
Pomógł: 2
Dołączył: 15.02.2004

Ostrzeżenie: (30%)
XX---


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).
Go to the top of the page
+Quote Post
Juzef
post
Post #8





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 15.02.2006
Skąd: Zakrzów

Ostrzeżenie: (0%)
-----


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.


--------------------
Linux is like wigwam: no gates, no windows, apache inside.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 05:00