Mariusz Gil - Sphinx
-
Upload
afterdesign -
Category
Documents
-
view
75 -
download
0
description
Transcript of Mariusz Gil - Sphinx
SPHINX
WebClusters 2011, Mariusz Gil <[email protected]>
rozproszony i skalowalny full-text search
piątek, 10 czerwca 2011
piątek, 10 czerwca 2011
SELECT * FROM tableWHERE content
LIKE "%pattern%"
piątek, 10 czerwca 2011
SELECT * FROM tableWHERE MATCH (fields)AGAINST (keywords)
Silnik Full-Text Search wbudowany w MySQL funkcjonuje obecnie tylko z engine MyISAM
piątek, 10 czerwca 2011
SELECT id, headline(doc, q), rank(vector, q) FROM docs, to_tsquery($1) AS q
WHERE vector @@ q ORDER BY rank(vector, q) DESC
Powyższy przykład dotyczy silnika tsearch2 współpracującego z bazą danych PostgreSQL
piątek, 10 czerwca 2011
ALTERNATYWY?
piątek, 10 czerwca 2011
piątek, 10 czerwca 2011
SPHINX
piątek, 10 czerwca 2011
• wysoka wydajność indeksowania i wyszukiwania danych
• zaawansowane narzędzia do indeksacji i odpytywania indeksów
• integracja ze źródłami danych SQL i XML
• proste skalowanie
piątek, 10 czerwca 2011
indexer searchd search
sphinxapi spelldump indextool
piątek, 10 czerwca 2011
ARCHITEKTURA
piątek, 10 czerwca 2011
serwer Sphinx
LINUX
APACHE
MySQL
PHP
{
Przykładowe miejsce osadzenia Sphinxa w aplikacji opartej o stos LAMP
indexer searchd
piątek, 10 czerwca 2011
serwer Sphinxserwer MySQL
id name value
1 lorem 234.34
2 ipsum 6784.21
3 dolor -235.12
Tabela sample_data
.spa .spd
.sph .spi
.spm .spp
Indeks sample_data
piątek, 10 czerwca 2011
source sample_data {type = mysqlsql_host = hostsql_user = database_usersql_pass = database_passwordsql_db = database_namesql_port = 3306
sql_query_pre = SET NAMES UTF8;sql_query = SELECT id, name, value FROM sample_data;sql_query_info = SELECT name, value FROM sample_data WHERE id=$id;
sql_attr_float = value;}
index sample_data {source = sample_datapath = /usr/local/sphinx/var/data/sample_datamorphology = none
min_word_len = 3 min_prefix_len = 3min_infix_len = 0enable_star = 0
}
piątek, 10 czerwca 2011
10:15
1GB
11:15
1GB
12:15
1GB
23:15
1GB
22:15
1GB...
Rozwiązanie 1: reindeksacja całości co X jednostek czasu
piątek, 10 czerwca 2011
04:15
1GB
05:1510 MB
...
Rozwiązanie 2: przebudowa indeksu głównego np. 1 na dobę, a co X jednostek czasu tylko indeksu delta
05:1511 MB
22:1560 MB
23:1564 MB
piątek, 10 czerwca 2011
FLOW
piątek, 10 czerwca 2011
serwer aplikacji
serwer Sphinx serwer data storage
klient
(1) query
(2) query(3) klucze dokumentów
(4) klucze dokumentów
(5) dane
(6) dane
piątek, 10 czerwca 2011
INSTALACJA
piątek, 10 czerwca 2011
LINUX:$ wget http://sphinxsearch.com/files/sphinx-0.9.9.tar.gz$ tar xzvf sphinx-0.9.9.tar.gz$ cd sphinx$ ./configure$ make$ make install
lub
MAC OSX:$ sudo port install sphinx
Podczas instalacji należy wskazać ścieżki do katalogów include/library wybranej bazy danych
piątek, 10 czerwca 2011
MacBook-Pro: mariusz$ indexer -c ./sphinx_1.conf --allSphinx 0.9.9-release (r2117)Copyright (c) 2001-2009, Andrew Aksyonoff
using config file './sphinx_1.conf'...indexing index 'cities_shard_1'...collected 6 docs, 0.0 MBsorted 0.0 Mhits, 100.0% donetotal 6 docs, 30147 bytestotal 0.105 sec, 285261 bytes/sec, 56.77 docs/secdistributed index 'cities' can not be directly indexed; skipping.total 2 reads, 0.000 sec, 11.5 kb/call avg, 0.0 msec/call avgtotal 7 writes, 0.000 sec, 8.7 kb/call avg, 0.0 msec/call avg
MacBook-Pro: mariusz$ searchd -c ./sphinx_1.confSphinx 0.9.9-release (r2117)Copyright (c) 2001-2009, Andrew Aksyonoff
using config file './sphinx_1.conf'...listening on 127.0.0.1:9313listening on all interfaces, port=3313
Fragmenty przykładowej konfiguracji z demo
piątek, 10 czerwca 2011
PRZESZUKIWANIE
piątek, 10 czerwca 2011
• LUB / ORAZ: hello | word, hello & world
• NEGACJA: hello -world
• OPERATOR POLA: @content hello
• FRAZY: „hello world”
• BLISKOŚĆ: „hello world”~10
• ... i jeszcze trochę innych
piątek, 10 czerwca 2011
• wyszukiwania geo-distance
• MVA - multi value attributes
• UNIX Timestamps
• wartości zmiennoprzecinkowe
• wartości całkowitoliczbowe
• dowolne łącznie powyższych z FTS
piątek, 10 czerwca 2011
titleweight: 100
contentweight: 80
tagsweight: 10
indeks bez wsparcia wyszukiwania infiksowego
titleweight: 200
contentweight: 10
tagsweight: 10
indeks obsługujący wyszukiwanie infiksowe na polu title
Indeks B
Indeks A
piątek, 10 czerwca 2011
require ( "sphinxapi.php" );
$cl = new SphinxClient ();
$cl->SetMatchMode ( SPH_MATCH_EXTENDED2 );$cl->SetSortMode ( SPH_SORT_RELEVANCE );$cl->AddQuery ( "the", "index" );$cl->SetSortMode ( SPH_SORT_EXTENDED, "published DESC" );$cl->AddQuery ( "@* the query", "index" );$cl->SetSortMode ( SPH_SORT_EXTENDED, "@relevance DESC, published DESC" );$cl->AddQuery ( "@(title,content) lorem ipsum", "index" );
$res = $cl->RunQueries();
SphinxAPI
SphinxAPI dostępne jest na najpopularniejsze platformy, m.in. PHP, Ruby, Java
piątek, 10 czerwca 2011
CREATE TABLE t1( id INTEGER UNSIGNED NOT NULL, weight INTEGER NOT NULL, query VARCHAR(3072) NOT NULL, group_id INTEGER, INDEX(query)) ENGINE=SPHINX CONNECTION="sphinx://localhost:9312/test";
SELECT * FROM t1 WHERE query='test it;mode=any';
SphinxSE
W przypadku SphinxSE, MySQL nie obsługuje indeksowania i wyszukiwania, jest jedynie proxy do Sphinxa
piątek, 10 czerwca 2011
$ mysql -P 9306Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 1Server version: 0.9.9-dev (r1734)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> SELECT * FROM test1 WHERE MATCH('test') -> ORDER BY group_id ASC OPTION ranker=bm25;+------+--------+----------+------------+| id | weight | group_id | date_added |+------+--------+----------+------------+| 4 | 1442 | 2 | 1231721236 || 2 | 2421 | 123 | 1231721236 || 1 | 2421 | 456 | 1231721236 |+------+--------+----------+------------+3 rows in set (0.00 sec)
SphinxQL
SphinxQL to docelowy główny protokół Sphinxa, nowości będą implementowane w nim w pierwszej kolejności
piątek, 10 czerwca 2011
SKALOWANIE
piątek, 10 czerwca 2011
PARTYCJONOWANIEHORYZONTALNE
piątek, 10 czerwca 2011
serwer Sphinx
index chunk 2
serwer Sphinx
index chunk 3
serwer Sphinx
index chunk N
...
serwer Sphinxz rozproszonym indeksem
index chunk 1
(1) query
(2) zapytania równoległe(3) klucze dokumentów
(4) zapytanie do lokalnego indeksu(5) łączenie wyników i usuwanie duplikatów
(6) odpowiedź
piątek, 10 czerwca 2011
index cities_shard_1{ source = cities_shard_1 path = /path/to/data/sphinx/cities_shard_1 docinfo = extern charset_type = utf-8 charset_table = 0..9, A..Z->a..z, a..z, \ U+0143->U+0144, U+0104->U+0105, U+0106->U+0107, \ U+0118->U+0119, U+0141->U+0142, U+00D3->U+00F3, \ U+015A->U+015B, U+0179->U+017A, U+017B->U+017C, \ U+0105, U+0107, U+0119, U+0142, U+00F3, U+015B, \ U+017A, U+017C, U+0144
min_word_len = 3 enable_star = 0}
index cities{ type = distributed
local = cities_shard_1 agent = localhost:9314:cities_shard_2}
Fragmenty przykładowej konfiguracji z demo
piątek, 10 czerwca 2011
BEZPIECZEŃSTWO
piątek, 10 czerwca 2011
DEMO
piątek, 10 czerwca 2011