Sphinx é uma poderosa plataforma de busca. De fácil instalação e utilização, é o companheiro perfeito para projetos PHP que necessitam buscar strings dentro de grandes volumes de dados em pouco tempo
Descrição : Buscar texto dentro de grandes volumes de dados é cada vez mais algo essencial em projetos de plataformas de conteúdo e gestão. Conforme seu volume de dados cresce, o bom e velho FULLTEXT no MySQL deixa de ser uma opção. Conheça a Sphinx e aprenda como instalá-la, como configurar e calibrar data sources e indexes para que a busca em seus projetos seja fácil de desenvolver, barata e escalável.
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um segundo - PHP e Sphinx Search
1.
2. Sobre o palestrante
Co-fundador e CTO da LQDI Digital
Projetos para empresas como Terra, Porto Seguro,
Garoto, Whirlpool, Editora Abril, Nestlé e AmBev
Engenheiro da Computação
Formado pela FIAP em 2013
12 anos trabalhando com PHP
Desde a época que o PHPClasses era a onda :)
Aryel Tupinambá
3. "I have a plan" (kinda)
1) O problema
2) Soluções "possíveis" com o MySQL
3) O porque eu coloquei "possíveis" em aspas
4) Introdução rápida ao Sphinx
5) Algumas alternativas ao Sphinx
6) Sphinx escala?
7) Configurando data sources
8) Índices do tipo "plain"
9) Índices do tipo "real-time" (RT)
10) Wrap-up
11) Moral da história
12) Dúvidas
13) Recado rápido do palestrante
14) Coffee break! o/
Aviso! Essa palestra contém:
Memes escrotos
Memes engraçadinhos
Montagens mal feitas
Argumentos para vender o Sphinx para o chefe
Coisa pra ***** pra estudar até o final do ano
4. Era uma vez um cliente…
Novo portal de notícias
Base de dados legada com
de 1 milhão de artigos
5. “Tá legal, mas cadê a busca?”
O cliente quer um buscador
que indexe todo o
conteúdo dos artigos
desde 1925
O prazo ainda não mudou
Pediram uma busca "tipo a
do Google" em termos de
relevância e velocidade
?
6. “Tá legal, mas cadê a busca?”
?
O cliente quer um buscador
que indexe todo o
conteúdo dos artigos
desde 1925
O prazo ainda não mudou
Pediram uma busca "tipo a
do Google" em termos de
relevância e velocidade
7. “Tá legal, mas cadê a busca?”
Como fazer?
Será que é viável?
Vai caber no orçamento?
9. Vamos tentar o de sempre
SELECT * FROM articles WHERE CONCAT(title, keywords) LIKE "%{$query}%"
Queries com LIKE
Lento e sem relevância
SELECT * FROM articles WHERE CONCAT(title, keywords) REGEXP "{$query}"
Queries com REGEXP
Muuuito lento, falsos positivos
SELECT * FROM articles WHERE
MATCH(title, keywords) AGAINST("+{$query}") IN BOOLEAN MODE
Queries com MATCH … AGAINST (índices FULLTEXT)
Relevância razoável, vários casos de exceção
Lento para inserir um registro
Sou obrigado a usar o MyISAM?
10. Vamos tentar o de sempre
SELECT * FROM articles WHERE CONCAT(title, keywords) LIKE "%{$query}%"
Queries com LIKE
Lento e sem relevância
SELECT * FROM articles WHERE CONCAT(title, keywords) REGEXP "{$query}"
Queries com REGEXP
Muuuito lento, falsos positivos
SELECT * FROM articles WHERE
MATCH(title, keywords) AGAINST("+{$query}") IN BOOLEAN MODE
Queries com MATCH … AGAINST (índices FULLTEXT)
Relevância baixa, vários casos de exceção
Lento para inserir um registro
Sou obrigado a usar o MyISAM?
11. If all you have is a hammer,
everything looks like a nail
“Podemos usar uma tabela MyISAM
paralela com a InnoDB só para busca!”
“E se a gente trocar os discos do servidor
por SSD?”
“E se a gente deixar os caches do MySQL gigantes?”
“E se…?”
12. “Podemos usar uma tabela MyISAM
paralela com a InnoDB só para busca!”
“E se a gente trocar os discos do servidor
por SSD?”
“E se a gente deixar os caches do MySQL gigantes?”
“Será que precisamos trocar o banco de dados?”
If all you have is a hammer,
everything looks like a nail
13. The right tools for the job
- Usar uma engine própria para busca
- Sphinx: solução quase plug-and-play
- Integra-se bem com o MySQL e com o PHP
- Fine-tuning opcional e fácil dos índices
- Diferença brutal de performance
- Busca
- Indexação
- Inserção / Atualização
14. Outras soluções
- Apache Solr
- Mais robusta e com mais features
- Mais difícil de instalar e configurar (Java JRE/XML hell)
- Amazon CloudSearch
- Vendor lock-in e código proprietário
- Custo maior e as vezes imprevisível
- Potencial de alta latência entre o CloudSearch e o seu servidor
- ElasticSearch
- Performance e features semelhantes
- Também roda no Java (Java JRE/XML hell)
- Maior foco no real-time
- API REST, algumas diferenças de paradigma
- Foco menor no SQL, combina melhor com NoSQL
15. A Sphinx Search
- Existe desde 2001
- 100% código aberto
- Apoiado por uma empresa comercial
- Usado por grandes e pequenos players
- Tumblr, The Pirate Bay, Craigslist, BBC, Scribd, Metacafe, OpenSubtitles.org
16. A Sphinx Search
- Curva de aprendizado suave
- Plug-and-play
- Windows, Mac e Linux
- Fácil configuração e fine-tuning
17. A Sphinx Search
- Até 1000x mais rápida que o FULLTEXT!
- Suporta vários tipos de banco de dados
- Opções de rankings de relevância
- Arquitetura distribuída
- Suporte a multi-queries
- Execução de queries em batch
- Otimização de queries que só variam no agrupamento
- Facilita a busca facetada
18. Mas será que escala?
Fonte: MySQL AB (recomendo altamente o artigo!)
http://en.oreilly.com/mysql2008/public/schedule/detail/511
19. Arquitetura da plataforma
Fonte: MySQL AB (recomendo altamente o artigo!)
http://en.oreilly.com/mysql2008/public/schedule/detail/511
PHP
searchd
indexer
MySQL
Sphinx
Index
Query usando a API ou SphinxQL
Conexão via protocolo MySQL wire
Query SQL com tabela
do tipo SPHINX
20. Instalando e configurando
apt-get install sphinxsearch
brew install sphinx --mysql
Baixar o ZIP no site sphinxsearch.com, extrair em
algum lugar e rodar o install.bat
Ubuntu e Debian
Mac OS X
Windows
Demais sistemas: ver sphinxsearch.com
21. Data sources
- Dá pra extender uma
source, sobreescrevendo
valores
- Attributes: campos
armazenados e filtráveis,
mas não indexados
- Fields: campos
armazenados e indexados
- MVAs: permite indexar e
retornar sub-elementos de
uma query, como tags,
categorias, etc
sphinx.conf
22. Indexes
- Índice do tipo plain: índice
estático, gerado via indexer
- Ideal para poucas
inserções e atualizações
ao longo do dia, ou
inserções pontuais em
massa (sites de notícia,
catálogos, e-commerces
com poucas promoções)
- Inúmeras otimizações
possíveis via configuração
28. Reindexando
Reindexar tudo
A opção --rotate permite que o índice seja construido em outro arquivo, permitindo
que o searchd continue servindo buscas durante a reindexação
29. Atualizando "live"
Leva um pouco mais de tempo que um insert convencional
(algo entre 1 e 100 segundos, dependendo do tamanho do índice)
30. Delta indexes
Separa o índice em dois,
mantém os dados mais
recentes (hot-band)
atualizados com
frequência, e os dados
antigos com menos
frequência (ou sem
atualizar)
31. Indexes
- Índice do tipo real-time: o
índice é alimentado e
atualizado em tempo real
- Ideal para bases de dados
"quentes", dados
alimentados via
crowdsourcing, ítens
únicos e singulares
- Não possuem data
sources; devem ser
alimentados manualmente
através de INSERTs
realizados via SphinxQL
- Uma pré-alimentação pode
ser feita através de um
índice plain, seguido de um
comando ATTACH
32. Manipulando o índice (RT)
Queries com SphinxQL funcionam igual
Se quiser transformar um índice plain em realtime, é só usar o comando ATTACH
O comando renomeia os arquivos de índice, fazendo a migração instantaneamente
33. Wrap-up
- Pode usar o Sphinx sempre que precisar de
busca em grandes massas de dados
- Ótima alternativa para o FULLTEXT do MySQL
- Escala muito bem, dificilmente precisará
trocar por uma engine mais robusta
- Roda muito bem em uma box de
$5/mês da DigitalOcean
- Não se apegue! Teste e compare com
ElasticSearch, Solr e outras soluções
35. Dúvidas?
Eu sei que o coffee break é logo mais, mas guentaí que eu tenho um recado rápido antes de encerrar!
36. A está contratando!
Procuramos desenvolvedores front-end e back-end, de TODOS os níveis de
experiência, apaixonados pelo que fazem e a fim de aprender e ensinar
Ambiente de trabalho bacana, descontraído, com remuneração competitiva,
horários flexíveis e bastante abertura para novas idéias. Sem melindres,
sem preciosismo e puxação de saco :D
Plano de carreira sólido e flexível, com espaço para crescimento em gestão
e especialização, e programas de feedback contínuo entre a equipe e os
gestores.
Manda um e-mail pra work@lqdi.net e cite a palestra da PHP Conference
Me chame pessoalmente agora no coffee break para trocarmos uma idéia
Começe 2015 de trampo novo!
37. Muitíssimo obrigado!
Hora do coffee break :)
CONTATOS
E-mail/Hangouts: aryel.tupinamba@lqdi.net
Twitter: @DfKimera
LinkedIn: br.linkedin.com/aryel.tupinamba
Curriculos para: work@lqdi.net
(por favor, cite a PHPConference)
SLIDES DA PALESTRA:
http://slideshare.com/aryeltupinamba