Post on 11-May-2015
description
Esqueça o ‘like %%’ Faça buscas inteligentes com Solr
@cloudson Claudson Oliveira
cloudson.github.io
Nome Categoria
Heineken garrafa cerveja
Brahma garrafa cerveja
Duff garrafa cerveja
Heineken engradado cerveja
Tabela de produtos
cerveja
Nome Categoria
Heineken garrafa cerveja
Brahma garrafa cerveja
Duffy garrafa cerveja
Heineken engradado cerveja
select * from produtos where nome like '%cerveja%' or categoria like '%cerveja%'
Duff
Nome Categoria
Heineken garrafa cerveja
Brahma garrafa cerveja
Duff garrafa cerveja
Heineken engradado cerveja
select * from produtos where nome like '%Duff%' or categoria like '%Duff%'
garrafas
Nome Categoria
Heineken garrafa cerveja
Brahma garrafa cerveja
Duff garrafa cerveja
Heineken engradado cerveja
select * from produtos where nome like '%garrafas%' or categoria like '%garrafas%'
garrafas
Nome Categoria
Heineken garrafa cerveja
Brahma garrafa cerveja
Duff garrafa cerveja
Heineken engradado cerveja
select * from produtos where nome like '%garrafa%' or categoria like '%garrafa%'
pasteis
garrafa cerveja
where nome like '%pastei% ...
where nome like '%garrafa cerveja% ...
uma gelada where nome like '%uma gelada% ...
Heineken engradado Ou
BRAHMA where nome like '%BRAHMA% ...
Java 6
Lucene ou Solr 4.5.1?
http://Localhost:8983
Apache License version 2 link
Referência
Jetty
Núcleos
<?xml version="1.0" encoding="UTF-8" ?> <solr> <cores adminPath="/admin/cores"> <core name="produto" instanceDir="produto" /> </cores> </solr>
solrSkeleton/schemas/solr.xml
Esquemas
Produto (schema solr)
Nome
Categoria
Valor
Descricao
Esquemas
solrSkeleton/schemas/product/conf/schema.xml
<?xml version="1.0" encoding="UTF-8"?> <schema name="Produto" version="1.1"> <types> <!-- tipos --> </types> <fields> <!-- campos --> </fields> </schema>
Esquemas - tipos
solrSkeleton/schemas/product/conf/schema.xml
<?xml version="1.0" encoding="UTF-8"?> <schema name="Produto" version="1.1"> <types> <fieldType name="inteiro" class="solr.IntField" /> <fieldType name=“frase" class="solr.StrField" /> </types> <fields> <field name=“id" type="inteiro" />
</fields> </schema>
Classe Descrição
Solr. IntField Inteiros de 32bits com sinal
Solr.StrField String
Solr.TextField Text, usually multiple words or tokens.
Solr.DateTime “Y-m-d H:i:s”
Referência
Esquemas - Filtros
solrSkeleton/schemas/product/conf/schema.xml
<?xml version="1.0" encoding="UTF-8"?> <schema name="Produto" version="1.1"> <types> <fieldType name="inteiro" class="solr.IntField" /> <fieldType name=“frase" class="solr.String" />
<fieldType name=“importante" class=“solr.TextField"> <analyzer> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" words="stopwords.txt" /> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.BrazilianStemFilterFactory"/> </analyzer>
</fieldType>
</types> <fields> <field name=“id" type="inteiro" />
</fields> </schema>
solrSkeleton/schemas/product/conf/schema.xml
Esquemas - Filtros
Filtro Exemplo
TrimFilterFactory “ phpsp” => “phpsp”
EdgeNGramFilterFactory “programador” => “pro” , “progr” ... “programador”
WordDelimiterFilterFactory “phpSp” => “php”, “sp” / “git2u” => “git” , “2” , “u”
SynonymFilterFactory “celular” => “iphone”, “galaxy”, “foston”, “celular”
PhoneticFilterFactory ????
Referência
Handler
solrSkeleton/schemas/product/conf/solrconfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <config> <luceneMatchVersion>4.4</luceneMatchVersion> <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/> <dataDir>${solr.core0.data.dir:}</dataDir> <schemaFactory class="ClassicIndexSchemaFactory"/> <updateHandler class="solr.DirectUpdateHandler2" /> <requestHandler name="standard" class="solr.StandardRequestHandler" default="true" /> <requestHandler name="/update" class="solr.XmlUpdateRequestHandler" /> <requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" /> <admin> <defaultQuery>solr</defaultQuery> </admin> </config>
Como salvar/atualizar um documento solr ?
Como salvar/atualizar um documento solr ?
POST http://localhost:8983/solr/produto/update HTTP/1.1 Content-Type: text/xml <add> <doc> <field name=“id">42</field> <field name="fieldname1">field valueA</field> <field name="fieldname2">field valueB</field> </doc </add>
Como buscar informação ?
<?php $client = new \Guzzle\Http\Client('http://127.0.0.1:8389/solr/produto'); $request = $client->get('/select?q=nome:iphone&wt=json'); $response = $request->send()->json(); // Faça o que quiser com o json $response
Rodando
ascii.io/~cloudson
Ferramentas Solr Pecl - http://pecl.php.net/package/solr
Solarium - http://www.solarium-project.org/
SolrBundle - https://github.com/floriansemm/SolrBundle
Guzzle - https://github.com/guzzle/guzzle
http://people.apache.org/~mikemccand/lucenebench/
Benchmark
1 Relevância
/select?q=nome:cartao^3 OR texto:cartao^1&wt=json
Resultado: 4 1 0
Nome: Cartão de visita Celular iphone Caderno pequeno
Texto: Ótima forma de divulgar sua marca. Tenha um cartão.
Combina com seu cartão de visita personalizado
Volte pra faculdade com estilo.
2 Mínimo de termos casados
/select?q=nome:iphone&mm=2<-1 5<80%&wt=json
2 < -1 5 < 80%
Iphone capa celular moda camarote
Ex:
Referência
3 Configuração default
<requestHandler name="standard" class="solr.StandardRequestHandler"> <lst name="defaults"> <str name="defType">dismax</str> <str name="qf">nome^5.0 categoria^4.0 descricao^3.0</str> <str name="mm">2<-1 5<80%</str> <str name="wt">json</str> <int name="rows">20</int> </lst> </requestHandler>
solrSkeleton/schemas/product/conf/solrconfig.xml
4 Autocomplete
/select?q=nome:iphone&group=true&group.field=categoria& group.limit=2&wt=json&cache=true
5 Sinônimos
Celular => iphone, galaxy, foston, moto
Dúvidas ? /cloudson
Replication http://wiki.apache.org/solr/SolrReplication
SpellChecker http://wiki.apache.org/solr/SpellCheckComponent
Leia mais
Livro http://www.packtpub.com/apache-solr-4-cookbook/book
http://lucene.apache.org/solr/
Caching http://wiki.apache.org/solr/SolrCaching
http://blog.sematext.com/2012/08/23/solr-vs-elasticsearch-part-1-overview/
Obrigado