Practical Thin Server Architecture With Dojo Sapo Codebits 2008
SAPO Pesquisa - Como funciona um motor de pesquisa
1. pesquisa.sapo.pt
João Pedro Gonçalves
Codebits, 14 de Novembro 2007
2. Agenda
A Pesquisa do SAPO
Como funciona um motor de Pesquisa
APIs de acesso à Pesquisa
3. A Pesquisa do SAPO
• 40 milhões Pesquisas
por mês.
• 50 Queries por
Segundo (QPS).
• Acordo com Google
desde 1999.
• Indexador FAST com
cerca de 75 milhões
de páginas indexadas.
4. A Pesquisa do SAPO
• Frontend em mod_perl
• Perl, Python, PHP, C e
C++
• Equipa de 10
programadores nas
áreas de Pesquisa,
Anúncios
contextualizados e
Directório
5. A Pesquisa do SAPO
• Interface com menus
contextuais.
• Preview e Gravar
página como PDF.
• Pesquisa de Notícias e
Blogs portugueses.
6. Como funciona um motor de Pesquisa
Desafios
Tempo de Resposta
Ranking
Volume de Informação
7. Tempo de resposta - ciclo Search, Find, Obtain
Mindstorms
Acesso rápido à
caixa de Pesquisa.
Resultado
Tempo de
pretendido rápido
carregamento da
de encontrar na
páginas de destino
página.
está fora de
controle do motor
de busca.
8. Autoridade e Relevância - Desafios
• Análise estrutural
da Web.
• Autoridade nem
sempre qualidade
• Comportamento
dos utilizadores
ajuda no ranking.
• Problemas com
Spam.
9. Volume da Informação - Desafios
~15 KB 75 1 Terabyte de Indice
por documento milhões de páginas de Pesquisa
Objectivo: No caso Português, garantir 50 QPS em menos
de 500ms por Pesquisa, com um Índice de 1 Terabyte.
10. Como funciona um motor de Pesquisa
Fases da Pesquisa
Crawling e análise de conteúdo
Indexação
Query
11. Crawlers
• Percorrem as páginas que
irão ser indexadas.
• Limite de pedidos por
site.
• Vários sites em
simultâneo, optimizado
para a largura de banda
disponível.
• Crawling distribuído.
• Master distribui tarefas,
cada nó é responsável
pelo seu armazenamento.
12. Document Pipeline
• Conteúdo dos crawlers é
enviado para a Document
Pipeline.
• Envio em batch dos
documentos.
• Cada url é um objecto
Document.
• No início do processo,
apenas sabemos a url e o
conteúdo do documento não
processado.
13. DOCInit
Document Pipeline EncodingNormalizer Preparar Documento
PDF/Flash / doc Converter
HTMLParsing
LinkExtractor Analizar estrutura
LinkAnalyzer
LanguageDetector
Vectorizer Análise linguística
Lemmatizer
GetLocations
GetPersonNames
• Cada componente na Extracção de Entidades
cadeia é um módulo GetDateAndTime
QualityBoosting
isolado que altera o Controle de Qualidade
RankTuning
objecto Document.
SerializeDocument
• Módulos desenvolvidos Send to Indexer
em Python.
Índice
15. Indexação doc1, (pos1,pos2, .., posN)
doc2, (pos1,pos2, .., posN)
termo
docN, (pos1,pos2, .., posN)
• Índices invertidos
optimizados para a
intersecção de termos.
• Posição relativa dos
termos é guardada.
19. Pesquisa distribuída
• Cada nó de Pesquisa tem
uma porção do índice total
de Pesquisa.
• A um conjunto de nós com o
mesmo índice chamamos de
Coluna.
• Uma pesquisa na Coluna
devolve sempre os mesmos
resultados.
20. Query
• Ao conjunto de nós que
perfazem a totalidade do
Índice, mas sem redundância
chamamos de Linha.
• Cada Linha responde a um
número limitado de QPS.
• Uma pesquisa é efectuada
em todas as colunas
presentes numa Linha.
21. Query
• A Matriz da Pesquisa é o
número de nós
[Linhas x Colunas ]
• Cada Pesquisa é balanceada
dentro de cada Coluna para
ser servida por um dos nós
com o mesmo Índice.
• O algoritmo de MergeSort
ordena os resultados que
vêm de cada nó.
22. Query Mindstorms
Col 2
Col 0
Merge(Col0, Col1, Col2)
Col 1
23. Open source
• Lucene
• Motor em Java.
• Suporte perfis de índices e
pesquisa em campos.
• SolR
• Baseado no Lucene.
• Optimizado para conteúdo web.
• APIs JSON e XML/RPC
24. Agenda
A Pesquisa do SAPO
Como funciona um motor de Pesquisa
APIs de acesso à Pesquisa
26. OpenSearch
<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
<OpenSearchDescription xmlns=quot;http://a9.com/-/spec/opensearchdescription/1.0/quot;>
<Url>http://pesquisa.sapo.pt/openSearch?
q={searchTerms}&count={count}&fs={startIndex}&rss=1</Url>
<Format>http://a9.com/-/spec/opensearchrss/1.0/</Format>
<ShortName>SAPO</ShortName>
<LongName>Pesquisa SAPO</LongName>
<Description>Pesquisa no Directorio SAPO - Portuguese only</Description>
<Tags>sapo portugal directorio pesquisa</Tags>
<Image>http://imgs.sapo.pt/images/c2/www.sapo.pt/icones_topo/logotipo/logo_b.gif</Image>
<SampleSearch>sapo</SampleSearch>
<Developer>Joao Pedro Goncalves</Developer>
<Contact>joaop@co.sapo.pt</Contact>
<Attribution>SAPO - Portugal Online, PT.COM</Attribution>
<SyndicationRight>open</SyndicationRight>
<AdultContent>false</AdultContent>
</OpenSearchDescription>
http://services.sapo.pt/Metadata/Service/Search
27. OpenSearch em Perl
use WWW::OpenSearch;
my $url = quot;http://services.sapo.pt/Metadata/OpenSearch/Searchquot;;
my $engine = WWW::OpenSearch->new($url);
# Perform search for quot;sapoquot;
my $response = $engine->search(quot;sapoquot;);
for my $item ($response->feed->items) {
print $item->title, quot;ntquot;,
$item->link, quot;nquot;;
}
http://services.sapo.pt/Metadata/Service/Search
28. Query completion - Collective Intelligence
• Análise dos queries
efectuados na Pesquisa do
SAPO
• Ordenar as pesquisas mais
frequentes devolve
comportamentos dos
Portugueses, um sistema de
sugestões de Pesquisa
• Fonte de informação valiosa
para previsão de
comportamento dos
utilizadores
29. Query completion
• Integração com Firefox
• Serviço já disponível
• Extremamente rápido
• Interface em JSON e XML
[quot;quarteiraquot;,[quot;quarteiraquot;,quot;apartamentos quarteiraquot;,quot;ferias quarteiraquot;,quot;hoteis
quarteiraquot;,quot;mapa quarteiraquot;,quot;hoteis em quarteiraquot;,quot;quarteira
apartamentosquot;,quot;quarteira nomes de cafesquot;,quot;hotel quarteira solquot;,quot;apartamentos na
quarteiraquot;,quot;quarteiraturquot;,quot;quarteiraoquot;,quot;orbitur quarteiraquot;,quot;quartos
quarteiraquot;,quot;camping quarteiraquot;,quot;parque campismo quarteiraquot;],[],[]]
http://pesquisa.sapo.pt/livesapo?q={query}
30. Obrigado!
Perguntas?
joaop@co.sapo.pt
João Pedro Gonçalves
Codebits, 14 de Novembro 2007