Sphinx считается одним из самых быстрых и гибких поисковых движков на рынке, но не является "коробочным" решением, чем отпугивает многих разработчиков. Я расскажу как быстро поднять полнотекстовый поиск для своего проекта на базе Sphinx, почему он крут и какие существуют интеграционные решения для Python.
27. полнотекстовый поиск
фильтрация
сортировка
группировка
сниппеты
работа с существующими документами
широкий набор атрибутов
быстрая индексация
гибкий язык запросов
морфологический анализатор
управление релевантностью
масштабируемость
скорость
качество
стоимость
Обычные требования к поиску
78. $ mysql -h 0 -P 9306
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 1
Server version: 2.0.6-release (r3473)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights
reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current
input statement.
mysql>
83. «Порционный» запрос
source company: common
{
sql_query_range =
SELECT MIN(id), MAX(id) from company
sql_range_step = 10000
sql_query =
SELECT company.id,
company.name,
company.date_created
FROM company
WHERE company.id BETWEEN $start AND $end
sql_field_string = name
sql_attr_timestamp = date_created
}
84. Расширяем «охват» индекса
source company: common
{
...
sql_query =
SELECT company.id,
company.name,
company.date_created,
"user".email as owner_email
FROM company
LEFT JOIN "user"
ON company.owner_id = "user".id
WHERE company.id BETWEEN $start AND $end
sql_field_string = name
sql_field_string = owner_email
sql_attr_timestamp = date_created
}
85. One-to-many? M2M? MVA!
source company: common
{
...
sql_field_string = name
sql_field_string = owner_email
sql_attr_timestamp = date_created
sql_attr_multi =
uint products from ranged-query;
SELECT company_id, id FROM product
WHERE id >= $start AND id <= $end;
SELECT MIN(id), MAX(id) FROM product
}
86. mysql> select name, products from company
where match('тнк')
and products in (109503, 1123362);
+------------------------------+----------+
| name | products |
+------------------------------+----------+
| ТНК-Транс | 109503 |
| ООО «ТНК-Транс» | 1123362 |
+------------------------------+----------+
2 rows in set (0.00 sec)
89. source company: common
{
sql_query_pre = SET @maxts:=(SELECT NOW())
sql_query = SELECT company.id, company.name FROM company
WHERE company.created_at < @maxts
...
sql_query_post =
REPLACE INTO search_deltacounters
VALUES (@id, 'company_tmp', @maxts)
sql_query_post_index =
DELETE FROM search_deltacounters
WHERE tablename='company'
sql_query_post_index =
UPDATE search_deltacounters
SET tablename='company' WHERE tablename='company_tmp'
}
Модифицируем основной индекс
90. source company_delta: company
{
sql_query_pre =
SET @maxts=(SELECT maxts FROM search_deltacounters
WHERE tablename='company')
sql_query = SELECT company.id, company.name FROM company
WHERE company.created_at >= @maxts
...
sql_query_post =
sql_query_post_index =
}
Создаём дельту
index company_delta: common
{
source = company_delta
path = /path/to/indexes/megaportal
}