Solr 4: Introdução
e Faceted Search
Michel Bottan
michel.bottan@elo7.com
TDC 2014 São Paulo
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
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
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.
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
Features
● Full-text search
● Hit hightlighting
● Faceted search
● Fuzzy / Proximity search
● Near real-time indexing
● Database integration
● Rich document handling
● Geospatial search
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
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
Índice invertido
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
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
● 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
O que é Faceted Search?
● 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
● 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
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
● 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
http://..:8983/solr/search-metrics/select?q=*:*&fq=page:1&wt=json&facet=true&facet.field=keyword&rows=0
Field Value Faceting: Resultados
facet_counts:
{
facet_queries: { },
facet_fields:
{
keyword:
[
"lembrancinha", 125629,
"bebe", 106350,
"casamento", 103706,
"aniversario e festa", 102394,
"decoracao", 77442,
"lembrancinhas de aniversario",75603,
"lembrancinhas de casamento", 55003,
"bebe reborn", 42638,
"convites de casamento",42538,
"convite", 40690
….
1ª - QTime: 1750
2ª - QTime: 500
http://..:8983/solr/search-metrics/select?q=*:*&fq=page:1&fq=keyword:lembrancinha&facet=true&facet.field=sort
Field Value Faceting: Filtrando
facet_counts:
{
facet_queries: { },
facet_fields:
{
sort:
[
"featured", 105081,
"relevance", 18976,
"minprice", 1245,
"maxprice", 143,
"newest", 139,
"unsorted", 30,
"oldest", 13,
"organic", 2
….
1ª - QTime: 1927
2ª - QTime: 13
● 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
● 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
}
…
● 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
…
}
}
…
● 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,
...
}
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
},
...
Obrigado!
Estamos contratando!
jobs@elo7.com
Blog de Engenharia
craftedbits.elo7.com.br

Introdução ao Solr e Faceted Search

  • 1.
    Solr 4: Introdução eFaceted 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) “Informationretrieval 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 buscatextual ● 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 eIndexaçã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" ... } TokenizerFilter 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
  • 9.
  • 10.
    Schema Design ● Camposdefinidos: 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 ● Querysingle 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 (tin 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
  • 13.
    O que éFaceted Search?
  • 14.
    ● Não forçahierarquia 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 buscarealizada é 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 campopara 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
  • 18.
    http://..:8983/solr/search-metrics/select?q=*:*&fq=page:1&wt=json&facet=true&facet.field=keyword&rows=0 Field Value Faceting:Resultados facet_counts: { facet_queries: { }, facet_fields: { keyword: [ "lembrancinha", 125629, "bebe", 106350, "casamento", 103706, "aniversario e festa", 102394, "decoracao", 77442, "lembrancinhas de aniversario",75603, "lembrancinhas de casamento", 55003, "bebe reborn", 42638, "convites de casamento",42538, "convite", 40690 …. 1ª - QTime: 1750 2ª - QTime: 500
  • 19.
    http://..:8983/solr/search-metrics/select?q=*:*&fq=page:1&fq=keyword:lembrancinha&facet=true&facet.field=sort Field Value Faceting:Filtrando facet_counts: { facet_queries: { }, facet_fields: { sort: [ "featured", 105081, "relevance", 18976, "minprice", 1245, "maxprice", 143, "newest", 139, "unsorted", 30, "oldest", 13, "organic", 2 …. 1ª - QTime: 1927 2ª - QTime: 13
  • 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 umaquery 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 intervalosuniformemente 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 osresultados, 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 (Solr4+) ● 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 }, ...
  • 25.
    Obrigado! Estamos contratando! jobs@elo7.com Blog deEngenharia craftedbits.elo7.com.br