1. Solr 4: Introdução
e Faceted Search
Michel Bottan
michel.bottan@elo7.com
TDC 2014 São Paulo
2. Quem sou ?
● Software Craftsman nos Greyjoy da Elo7
● Empreendedor e co-founder da Comune
● Experiência com Solr na Abril Digital, Comune e Elo7.
● Entusiasta de negócios de impacto social
○ Elo7 é um marketplace com +60mil vendedores.
Agenda
● Introdução ao Solr
● Faceted Search case Elo7
3. Information Retrieval (IR)
“Information retrieval is the activity of obtaining information
resources relevant to an information need from a collection
of information resources. Searches can be based on
metadata or on full-text (or other content-based) indexing.”
--Wikipedia
4. O que é ?
O que é ?
Solr é uma plataforma de busca open source confiável,
escalável e tolerante a falha.
Apache Lucene Project
Engine de busca textual de alta-performance em Java. Open
source e seu core pode ser usado independente do Solr.
5. Engine de busca textual
● Lucene criado em 1999 por Doug Cutting, mesmo criador do
Nutch e Hadoop.
● Solr criado 2004 por Yonik Seeley
● Em 2010, projetos Lucene e Solr mergeados
● Solr e Lucene versão 4.9.0
● Mesmo time de desenvolvedores.
● Backed by Lucid Imagination
Histórico
6. Features
● Full-text search
● Hit hightlighting
● Faceted search
● Fuzzy / Proximity search
● Near real-time indexing
● Database integration
● Rich document handling
● Geospatial search
7. Interface HTTP
Query e Indexação
Query Parsing
Text Analysis
Search Components
● Facets
● Filtering
● Geospatial
● Spelling
● More Like This
Caching
Admin
DIH - Data Import
Handler
Index Replication
Index
Searcher / Writer
Query Parser
Arquitetura
8. Pipeline indexação
{
"id":"ABC_123",
"title":"Zen zazen"
...
}
Tokenizer Filter
Documento
Post
/update
Field Analyzer indexação/query
Lucene
Inverted Index
Alianças de casamento
WhitespaceTokenizer Alianças de casamento
LowercaseFilter alianças de casamento
StopwordFilter alianças casamento
PortugueseLightStemmerFilter alianc casament
10. Schema Design
● Campos definidos: explicitamente declarados na configuração
<field name="preco" type="float" default="0.0" indexed="true" stored="true"/>
● Campos dinâmicos: sufixo determina o tipo do campo
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
● Campos copiados: campo de origem e destino
<copyField source="cat" dest="text" maxChars="30000" />
● Schemaless Mode: Solr infere o tipo na primeira chamada e cria um
schema dinâmicamente
11. Query syntax
● Query single e multi term
○ nome_campo: valor ou titulo:casamento
● Operadores +, -, AND, OR NOT
○ titulo: (software AND engineer)
● Range queries: em campos númericos e data
○ timestamp: [ * TO NOW ] ou preco: [ 1 TO 100 ]
● Boost queries:
○ titulo:Lembrancinha ^1.5 OR text:Lembrancinha
● Fuzzy search: busca por palavras com grafia semelhante
○ calda ~0.8 => cauda
● Proximity Search: phrase query menos restrita. Quanto mais perto os
termos, maior o score.
○ “apache lucene”~20
12. ● tf (t in d): frequência do termo no documento
○ número de vezes que o termo t aparece no documento d
○ documentos com mais ocorrências do termo t recebem maior score
● idf (t): frequência inversa do documento
○ inverso da docFreq (número de documentos em que o termo t aparece)
○ quanto mais raro o termo t maior o score documento
● coord: quantos dos termos buscados são encontrados no
documento
○ quantos mais termos t aparecem no documento, maior o score do documento
● boost (index) : boost num campo em tempo de indexação
● boost (query) : boost no campo em tempo de busca
Relevância
14. ● Não força hierarquia de
opções
○ usuário pode aplicar e
remover filtros de facets
em qualquer ordem
● Sem surpresas
○ usuário sabe o que
esperar antes de aplicar
o filtro
Faceted Search
15. ● Cada busca realizada é indexada como um documento.
+1milhão de buscas de usuários por dia
{ id: "10c8be8e-2d75-4c07-ad17-20ebd0a17ad2", keyword: "Organizador de Bolsa",
keyword_original: "Organizador de Bolsa", user: “buyer”, page: 2, hits: 3326, time: 7,… }
● Solr pré-processa e normaliza termos de busca.
○ alianças casamento, aliança casamento, alianca casamento
● Métricas quase real time. Barato, simples e escalável (por
um tempo)!
Métricas de busca
16. Indexação para Facets
● Facet é feito no valor indexado e não no stored
● Indexação
○ Não tokenizado em palavras separadas
○ Não mapeado para lowercase
○ Humam-readable, acentuação não removida
17. ● Especifica campo para facet
● Cada termo indexado no campo é uma constraint
● Campo deve ser indexado
● Pode ser usado múltiplas vezes
Field Value Faceting
q=*:*
fq = page:1
facet = true
facet.field = keyword
facet.field = city
20. ● facet.prefix - Restringe à valores indexados com o prefixo.
● facet.mincount = 0 - Número mínimo de contadores
● facet.sort = count, index - Ordenação por quantidade ou
lexicográfica
● facet.offset = 0 - Quantos resultados devem ser escapados.
● facet.limit = 100 - Número de resultados
● facet.missing = false – Número de documentos sem valor
indexado
Parâmetros facet.field
21. ● Especifica uma query arbitrária no formato do Lucene
● Multiplas queries com restrições
Query Faceting
facet.query=time:[* TO 50]
facet.query=time:[50 TO 200]
facet.query=time:[200 TO *]
…
facet_queries:
{
time:[* TO 50]: 25985897,
time:[50 TO 200]: 3273294,
time:[200 TO *]: 529980
}
…
22. ● Cria intervalos uniformemente dimensionados
● Ranges de data são especificados usando expressões
“DateMath”
● Usado em campos numéricos e data
Range Faceting
facet.range: "created_at"
facet.range.start: "NOW/YEAR-1YEAR"
facet.range.end: "NOW/MONTH+1MONTH"
facet.range.gap: "+1DAY"
…
facet_ranges: {
created_at: {
...
"2014-07-28T00:00:00Z", 1030403,
"2014-07-29T00:00:00Z", 966961,
"2014-07-30T00:00:00Z", 904438
…
}
}
…
23. ● Filtra os resultados, mas permite preservar os resultados
de facets
● Permite colocar tag no filtro
● Permite excluir certos filtros quando fizer facet
Multi-select Faceting
facet=true
fq=page:1
fq={!tag=kw}keyword:lembrancinha
facet.field={!ex=kw}keyword
…
facet_fields: {
keyword:[
"lembrancinha", 125629,
"bebe", 106350,
"casamento", 103706,
"aniversario e festa",
102394,
"decoracao", 77442,
...
}
24. Pivot Faceting (Solr 4+)
● Realiza um facet dentro dos resultados de um facet pai
facet=true
fq=page:1
&facet.pivot=city,keyword
…
facet_pivot:
{
city_keyword:
[ {
field: "city",value: "são paulo",
count: 8921, pivot:
[
{
field: "keyword", value: "convites de casamento",
count: 217
},{
field: "keyword", value: "lembrancinha",
count: 140
},{
field: "keyword",value: "bebe reborn",
count: 74
},
...