Mariusz Gil - Sphinx

Post on 10-Mar-2015

38 views 0 download

description

SPHINXrozproszony i skalowalny full-text searchWebClusters 2011, Mariusz Gil piątek, 10 czerwca 2011piątek, 10 czerwca 2011SELECT * FROM table WHERE content LIKE "%pattern%"piątek, 10 czerwca 2011SELECT * FROM table WHERE MATCH (fields) AGAINST (keywords)Silnik Full-Text Search wbudowany w MySQL funkcjonuje obecnie tylko z engine MyISAMpiątek, 10 czerwca 2011SELECT id, headline(doc, q), rank(vector, q) FROM docs, to_tsquery($1) AS q WHERE vector @

transcript

SPHINX

WebClusters 2011, Mariusz Gil <mariusz.gil@scalability.pl>

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