introdução ao solr e faceted search
Post on 27-Jun-2015
856 Views
Preview:
DESCRIPTION
TRANSCRIPT
Solr 4: Introdução e Faceted Search
Michel Bottanmichel.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 ThisCaching
Admin
DIH - Data Import Handler
Index Replication
Index Searcher / Writer Query Parser
Arquitetura
Pipeline indexação
{ "id":"ABC_123", "title":"Zen zazen"...}
Tokenizer Filter
DocumentoPost
/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:1facet = truefacet.field = keywordfacet.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: 17502ª - 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: 19272ª - 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=truefq=page:1fq={!tag=kw}keyword:lembrancinhafacet.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=truefq=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
top related