Wyszukiwanie pełnotekstowe z wykorzystaniem Search Engine
Wyszukiwanie pełnotekstowe (ang. full-text search) - co to jest? Jest sposobem przeszukiwania danych tekstowych, który bazuje na analizie poszczególnych słów danej frazy w przeszukiwanym tekście.
Jak to działa? Przetworzenie dokumentu tekstowego Utworzenie wektora słów zawartych w dokumencie Eliminacja stop-słów (usuwanie szumu z, ale, od, tam ) Lematyzacja lub stemming (sprowadzanie do podstawowej formy: samochody samochód) Utworzenie indeksu FTS
Dostępne na rynku narzędzia Sphinx Search Engine (C++) Solr (bazujący na bibliotece Lucene, JAVA) DataparkSearch (C) Ferret (Ruby) mnogosearch (C)
Sphinx podstawowa funkcjonalność Prędkość indeksowania (do 10-15 MB/sek na jednym rdzeniu procesora); Prędkość wyszukiwania (do 150-250 zapytań/sec na jednym rdzeniu, 1 000 000 dokumentów, 1.2 GB wielkość indeksu); Wysoka skalowalność (największy znany klaster to 3,000,000,000 dokumentów i największym obciążeniu 50,000,000 zapytań/dzień); Wysoka jakość wyników (posiada kilka modeli wagowania wyników) Możliwość rozproszonego wyszukiwania Generowanie snippetów
Sphinx podstawowa funkcjonalność Możliwość wyszukiwania poprzez SphinxAPI, SphinxQL oraz w samym MySQL u (posiada własny silnik magazynowania danych SphinxSE); Obsługa stop-słów (stopwords); Obsługa własnych słowników odmian (algorytm bądź słownik); Stemowanie (wbudowane stemmery dla języków: angielskiego, rosyjskiego oraz czeskiego; wsparcie dla większej ilości języków poprzez bibliotekę libstemmer polskiego nadal brak); Tokenizacja (usuwanie znaków specjalnych); Wbudowane wsparcie dla MySQL, PostgreSQL oraz wszystkich baz zgodnych z ODBC (Open DataBase Connetcivity) (MS SQL, Oracle, etc)
Instalacja pod Windowsem Po rozpakowaniu archiwum należy zainstalować searchd jako usługę. W tym celu w konsoli wpisujemy (jako administrator): C:\Sphinx\bin\searchd --install --config C:\Sphinx\sphinx.conf --servicename SphinxSearch Następnie dodajemy do ścieżki systemowej C:\Sphinx\bin Abyśmy mogli cokolwiek przetestować musimy skonfigurować źródło danych i utworzyć indeks - o tym w dalszej części
Instalacja pod Linuxem Gentoo: USE= mysql (postgres) (-debug) (id64) (stemmer) emerge app-misc/sphinx Debian: apt-get install sphinxsearch
Podstawowe moduły indexer - główne narzędzie, tworzy index search - narzędzie do testowania stworzonych indeksów searchd - demon dzięki któremu zewnętrzne aplikacje lub API mogą przeszukiwać indeksy SphinxAPI - zbiór api dla różnych języków programowania (PHP, JAVA, Python, Ruby, C)
Konfiguracja (sphinx.conf) sekcje source nazwa_zrodla #ustawienia źródła danych np. MySQL index nazwa_indexu #ustawienia indexu indexer #ustawienia indexera (limity pamięci etc.) searchd #ustawienia deamon a sphinxa
source (źródła danych) Pełna lista opcji: http://sphinxsearch.com/docs/2.0.4/confgroup-source.html source ogloszenia type = mysql sql_host = 127.0.0.1 sql_user = sphinx_user sql_pass = tajnehaslo!@# sql_db = cms sql_port = 3306 sql_query_pre sql_query sql_query_info = SET NAMES utf8 = SELECT tytul, tresc, autor, streszczenie FROM artykuly\ WHERE publikuj = 1 = SELECT id FROM artykuly WHERE id=$id
index Pełna lista opcji: http://sphinxsearch.com/docs/2.0.4/confgroup-index.html index artykuly source = artykuly path = /var/lib/sphinx/artykuly min_word_len = 2 html_strip = 1 morphology = stem_en stopwords = /etc/sphinx/language/pl/stop_words_pl.txt wordforms = /etc/sphinx/language/pl/pl_dict.txt charset_type = utf-8 #zmienia wielkość liter z dużych na małe ignore_chars = U+002D, U+00AD charset_table = \
indexer Pełna lista opcji: http://sphinxsearch.com/docs/2.0.4/confgroup-indexer.html indexer mem_limit = 2M write_buffer = 1M max_iops = 40 max_iosize = 1048576
searchd Pełna lista opcji: http://sphinxsearch.com/docs/2.0.4/confgroup-searchd.html searchd listen = 9312 log = /logs/searchd.log query_log = /logs/query.log read_timeout = 2 max_children = 2 pid_file max_matches = 10000 seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 compat_sphinxql_magics = 0 workers = fork = /var/run/sphinx/searchd.pid
Przyrostowy indeks main + delta # Nowa tabela w MySQL CREATE TABLE sph_counter ( counter_id INTEGER PRIMARY KEY NOT NULL, max_doc_id INTEGER NOT NULL );
Edytujemy sphinx.conf source main #... sql_query_pre = SET NAMES utf8 sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM artykuly sql_query = SELECT id, tytul, tresc, streszczenie FROM artykuly \ WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) AND publikuj = 1 index main source = main path = /sciezka/do/main #... pozostałe ustawienia
Wszystkie inne ustawienia kopiowane są z main do delta, ale source i ścieżka są nadpisywane index delta : main source = delta path = /path/to/delta source delta : main sql_query_pre = SET NAMES utf8 sql_query = SELECT id, tytul, tresc, streszczenie FROM artykuly \ WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )\ AND publikuj = 1
Dziękuję za uwagę! Łukasz Wrucha Starszy programista tel.: +48 505 619 328 e-mail: lukasz.wrucha@supertraders.pl www.supertraders.pl - Twoja nawigacja w Biznesie