Pełnotekstowa wyszukiwarka Sphinx
1 November 2008
Comments
Sphinx to (w przypadku tego artykułu) pełnotekstowa wyszukiwarka potrafiąca indeksować dane z baz MySQL, PostgreSQL, czy też danych w specjalnym formacie XML. Sphinx składa się z następujących elementów:
- indexer: narzędzie do tworzenia pełnotekstowych indeksów (indices)
- search: proste (testowe) narzędzie do wykonywania zapytań
- searchd: demon do przeszukiwania indeksów przez zewnętrzne aplikacji (np. skrypty www komunikujące się przez API, MySQ z SphinxSE itp.)
- sphinxapi: zbiór bibliotek udostępniających API Sphinxa dla PHP, Pythona, Javy, Perla, czy Rubiego
- Wysokie prędkości indeksowania (do 10 MB/s)
- Wysokie prędkości wyszukiwania
- Wysoka skalowalność (do 100 GB tekstu, 100 milionów dokumentów na jednym procesorze)
- Obsługuje rozproszone wyszukiwanie (od 0.9.6)
- Natywna obsługa MySQL
- Obsługuje wyszukiwanie fraz
- Obsługa słowotwórstwa angielskiego i rosyjskiego
- Obsluga "stopwords"
Konfiguracja Sphinxa
By mieć działającą wyszukiwarkę danych zawartych w bazie MySQL musimy mieć - tabele z danymi, oraz musimy skonfigurowac indeks Sphinxa dla tych tabel. Dla przykładu stworzymy tabelę dla wiadomości (np. stworzoną przez Django dla naszej aplikacji):CREATE TABLE IF NOT EXISTS `news_news` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(255) collate utf8_polish_ci NOT NULL,
`slug` varchar(255) collate utf8_polish_ci NOT NULL,
`text` longtext collate utf8_polish_ci NOT NULL,
`date` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `slug` (`slug`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
# nasze źródło
source django_news
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = sph
sql_port = 3306
sql_query = SELECT `id`, `title`, `slug`, `text`, `date` FROM `news_news`
sql_query_info = SELECT * FROM `news_news` WHERE id=$id
}
# definiujemy indeks
index django_news
{
source = django_news
path = /var/lib/sphinx/data/django_news
docinfo = extern
charset_type = sbcs
}
# ustawienia, np. limit pamięci
indexer
{
mem_limit = 32M
}
# ustawienia demona wyszukiwania / domyślne z przykładowej konfiguracji
searchd
{
port = 3312
log = /var/lib/sphinx/log/searchd.log
query_log = /var/lib/sphinx/log/query.log
read_timeout = 5
max_children = 30
pid_file = /var/lib/sphinx/log/searchd.pid
max_matches = 1000
seamless_rotate = 1
preopen_indexes = 0
unlink_old = 1
}
sphinx-indexer --config /etc/sphinx/sphinx.conf --all
By wyszukać wiadomości w stworzonym indeksie:
sphinx-search --config /etc/sphinx/sphinx.conf bmw
Sphinx 0.9.8.1-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
using config file '/etc/sphinx/sphinx.conf'...
index 'django_news': query 'bmw ': returned 2 matches of 2 total in 0.000 sec
displaying matches:
1. document=1, weight=3
id=1
title=*coś*
slug=*coś*
text=*coś*
date=2008-11-01 14:50:05
2. document=2, weight=1
id=2
title=*coś*
slug=*coś*
text=*coś*
date=2008-11-01 14:50:34
words:
1. 'bmw': 2 documents, 5 hitsWyszukiwanie w Sphinx z poziomu Pythona
Do obsługi Sphinxa w Pythonie możemy wykorzystać bibliotekę sphinxclient.py. By wyszukać frazę w naszym indeksie wystarczy taki kod:# -*- coding: utf-8 -*-
from sphinxclient import *
c = SphinxClient(host='localhost', port=3312)
res = c.query('bmw', index='django_news')
for i in res['matches']:
print i
(1, 3, {})
(2, 1, {})
Gdzie pierwsza liczba to wartość pola ID w tabeli, a druga to wartość atrybutu "weight" nadana przez Sphinxa.
W przypadku dużej ilości dopasowanych rekordów Sphinx zwróci domyślnie pierwsze 1000 trafień. Żeby pobrać wszystkie wyniki należy ponownie wywołać metodę query podając dodatkowo argument offset, określający "stronę" wyników.
# -*- coding: utf-8 -*-
from sphinxclient import *
c = SphinxClient(host='localhost', port=3312)
res = c.query('bmw', index='django_news')
for i in res['matches']:
print i
if res['total_found'] > 1000:
pages = float(res['total_found']/1000)
ofset = 1
while ofset <= pages:
res = c.query(q, index='django_news', offset=ofset)
ofset = ofset+1
if len(res['matches']) > 0:
for i in a['matches']:
print i
In-Depth django-sphinx Tutorial
Lista artykułów poświęconych Sphinxowi
Dokumentacja
RkBlog
Comment article