Dawno minęły czasy kiedy w sieci królował tylko jeden język - angielski. Obecnie znaczna część dużych serwisów internetowych może pochwalić się obsługą wielu języków, aby dotrzeć do jak największej liczby odbiorców. W związku z tym konieczna jest obsługa znaków charakterystycznych dla poszczególnych języków, np. znaków diakrytycznych języka polskiego, co można uzyskać dzięki kodowaniu UTF-8. A jak wygląda wsparcie UTF-8 przez SphinxSearch?
W trakcie procesu indeksowania Sphinx pobiera kolejne dokumenty z podanego źródła (baza danych, XML), rozbija na poszczególne słowa (tokeny) oraz dokonuje ich konwersji, np. zamiana wielkich liter na małe. Aby przeprowadzić wspomniany proces prawidłowo niezbędne jest określenie kodowania tekstu źródłowego, określenia zbioru liter, mapy konwersji znaków (np. polskich znaków diakrytycznych na ich odpowiedniki bez ogonków) oraz zbioru separatorów. Sphinx umożliwia skonfigurowanie każdego z indeksów osobno.
Obsługa kodowania realizowana jest przez opcję charset_type (sekcja index). Domyślną wartością jest sbcs, ale od wersji 2.2 opcja ta traktowana będzie jako przestarzała (ang. deprecated) i jedynym (domyślnym) kodowaniem w ten sposób będzie UTF-8.
Jednak samo ustawienie kodowania nie rozwiązuje wszystkich problemów. Domyślnie wszystkie znaki, oprócz liter angielskiego, rosyjskiego alfabetu oraz cyfr, traktowane są jako separatory. Dodatkowo wielkie oraz małe litery są rozróżniane, tak samo jak polskie znaki diakrytyczne z ogonkami i bez ogonków. Z punktu widzenia działania naszej aplikacji chcielibyśmy, aby użytkownik działał intuicyjnie i nie zastanawiał się czy wpisując frazę Gdańsk otrzyma także wyniki zawierające Gdansk oraz gdansk. Należy pamiętać o tym, że wybrane kodowanie oraz lista znaków traktowanych jako litery (wraz z ich ewentualnymi przekształceniami) będzie wpływało na indeksowanie dokumentów oraz wyszukiwanie (parsowanie zapytań i rozbijanie na poszczególne słowa). W związku z tym, oprócz wyboru kodowania (charset_type) konieczne jest zdefiniowane znaków traktowanych jako litery wraz z ich konwersją (wielkich liter na małe, polskich znaków diakrytycznych z ogonkami na ich odpowiedniki bez ogonków itd.).
Umożliwia to opcja charset_table (również sekcja index):
Podsumowując powyższe rozważania, obsługę języka polskiego (polskie znaki diakrytyczne, zamiana wielkich liter na małe oraz polskich znaków diakrytycznych na ich odpowiedniki bez ogonków) uzyskamy dzięki następującej konfiguracji:
Zainteresowanych tematem (oraz obsługą innych języków niż angielski, polski czy rosyjski) odsyłam do lektury:
- http://sphinxsearch.com/wiki/doku.php?id=charset_tables
- https://github.com/tom–/Collation-to-Charset-Table
- http://sphinxsearch.com/forum/view.html?id=1133
- http://thefsb.wordpress.com/2010/12/
- http://sphinxsearch.com/blog/2013/09/11/deprecations-and-changes-in-the-2-2-series/
- http://sphinxsearch.com/docs/current.html#charsets
- http://sphinxsearch.com/docs/2.1.7/conf-charset-type.html
- http://www.ivinco.com/blog/sphinx-in-action-how-sphinx-handles-text-during-indexing/
- http://sphinxsearch.com/forum/view.html?id=9312
tagi: sphinx , search , indexer , sphinxsearch , utf8