30
Extendiendo Solr

Conferencia 5: Extendiendo Solr

Embed Size (px)

Citation preview

Page 1: Conferencia 5: Extendiendo Solr

!

Extendiendo Solr

Page 2: Conferencia 5: Extendiendo Solr

Search Update

SolrRequestHandler

Sear

chCo

mpo

nent

s

UpdateHandler

UpdateProcessors

Dispatcher

DocTransformers

QueryResponseWriter

SolrCache QParser

schema.xml

solrconfig.xml

Response

Text Analysis

Index

Query

Lucene Index

Query

ValueSourceParser

!"

DirectoryFactory

CodecFactory

IndexSchemaFactoryTokenFilter MergePolicy

MergePolicy

CacheRegenerator

Ilustration by Jorge Luis Betancourt GonzálezYou may freely use it as long as you attribute to the author, to the CC-by license www.creativecommons.org

QParserPlugin

Page 3: Conferencia 5: Extendiendo Solr

El proyecto

Page 4: Conferencia 5: Extendiendo Solr

Librerías necesarias …

solr-core-* solr-solrj-* solr/dist/

slf4j-api-*solr/dist/solrj-lib

Page 5: Conferencia 5: Extendiendo Solr

example/solr-webapp/webapp/WEB-INF/lib

lucene-core-*

Page 6: Conferencia 5: Extendiendo Solr

SearchComponent

Page 7: Conferencia 5: Extendiendo Solr

Ejecutar alguna lógica determinada durante el proceso de búsqueda, puede ser antes de la ejecución de la query o

después sobre el resultado de la query.

Page 8: Conferencia 5: Extendiendo Solr

Todos los componentes necesitan heredar de la clase abstracta

!

SearchComponent !

del paquete org.apache.solr.handler.component

Page 9: Conferencia 5: Extendiendo Solr

public void prepare(ResponseBuilder rb)

Prepara la respuesta, se garantiza que se llama antes que el método process() de cualquier otro SearchComponent.

public void process(ResponseBuilder rb)

Ejecuta la lógica de procesado para este componente.

Page 10: Conferencia 5: Extendiendo Solr

public String getSource();

Método de ayuda devuelve el nombre del archivo que implementa el componente, ej.: cu.orion.MaxParameters

public String getDescription();

Devuelve una breve descripción sobre lo que debe hacer el método, utilizado para debug.

Page 11: Conferencia 5: Extendiendo Solr

Parámetros de configuración<searchComponent name="max-parameters" class="orion.MaxParamsSearchComponent"> <str name="rows">10</str> <str name="start">2</str> </searchComponent>

parámetros de configuración del componente

Page 12: Conferencia 5: Extendiendo Solr

public void init( NamedList args )

Este método tiene acceso a los parámetros de configuración definidos en el archivo solrconfig.xml

public void init(NamedList args) { if (null != args) { SolrParams params = SolrParams.toSolrParams(args); } }

Page 13: Conferencia 5: Extendiendo Solr

SolrParamspublic Boolean getBool(String param, boolean def) public int getInt(String param, int def) public float getFloat(String param, float def) public double getDouble(String param, double def) public String get(String param, String def)

Page 14: Conferencia 5: Extendiendo Solr

maxRowsParam = params.getInt("rows", -1); !maxStartParam = params.getInt("start", -1)

llave/nombre

valor por defecto

Page 15: Conferencia 5: Extendiendo Solr

Implementar un componente que no permita pedir más de un número N de

documentos en cada petición.

Page 16: Conferencia 5: Extendiendo Solr

demo

Page 17: Conferencia 5: Extendiendo Solr

mkdir -p solr/collection1/lib

Copiar el .jar desde el directorio de compilación de nuestro proyecto hacia:

!

solr/collection1/lib

Page 18: Conferencia 5: Extendiendo Solr

<searchComponent name="max-parameters" class="cu.uci.solr.MaxSearchComponent"> <str name="rows">10</str> <str name="start">2</str> </searchComponent>

<arr name="first-components"> <str>max-parameters</str> </arr>

Page 19: Conferencia 5: Extendiendo Solr

<response> <lst name="responseHeader"> <int name="status">400</int> <int name="QTime">19</int> </lst> <lst name="error"> <str name="msg"> Your start or rows parameter has exceeded the allowed values </str> <int name="code">400</int> </lst> </response>

/select?q=*:*&rows=200

Page 20: Conferencia 5: Extendiendo Solr

Excepciones de SolrExceptionpublic enum ErrorCode { BAD_REQUEST( 400 ), UNAUTHORIZED( 401 ), FORBIDDEN( 403 ), NOT_FOUND( 404 ), SERVER_ERROR( 500 ), SERVICE_UNAVAILABLE( 503 ), UNKNOWN(0); }

Estos códigos son equivalentes a los códigos HTTP ya vistos.

Page 21: Conferencia 5: Extendiendo Solr

throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "Your start or rows parameter has exceeded the allowed values");

Page 22: Conferencia 5: Extendiendo Solr

curl --head http://localhost:8983/solr/collection1/select\?q\=\*:\*\&rows\=200

HTTP/1.1 400 Bad Request Cache-Control: no-cache, no-store Pragma: no-cache Expires: Sat, 01 Jan 2000 01:00:00 GMT Last-Modified: Mon, 29 Sep 2014 02:10:56 GMT ETag: "148bf2cc9d6" Content-Type: application/xml; charset=UTF-8 Content-Length: 0

Page 23: Conferencia 5: Extendiendo Solr

DocTransformers

Page 24: Conferencia 5: Extendiendo Solr

Nos permite añadir/quitar campos de la respuesta que se envía al cliente justo

antes de ser serializada. Se puede añadir o remover campos independientemente

del parámetro fl.

Page 25: Conferencia 5: Extendiendo Solr

Para crear un DocTransformer se

necesitan 2 clases

MyDocTransformer

MyDocTransformerFactory

Page 26: Conferencia 5: Extendiendo Solr

MyDocTransformerFactory

TransformerFactory

MyDocTransformer

DocTransformer

Page 27: Conferencia 5: Extendiendo Solr

public DocTransformer create( String field, SolrParams params, SolrQueryRequest req)

Factory

public void init(NamedList args)

método responsable de crear una instancia del DocTransformer

Page 28: Conferencia 5: Extendiendo Solr

public String getName()

DocTransformer

public void transform( SolrDocument doc, int docid)

añade/quita campos de la instancia de SolrDocument

Page 29: Conferencia 5: Extendiendo Solr

demo

Page 30: Conferencia 5: Extendiendo Solr

<transformer name="mytrans2" class="my.transform.MyDocTransformerFactory"> <int name="value">5</int> </transformer>

/select?q=*:*fl=[name]

solrconfig.xml

getName()