Conferencia 5: Extendiendo Solr

Preview:

Citation preview

!

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

El proyecto

Librerías necesarias …

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

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

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

lucene-core-*

SearchComponent

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.

Todos los componentes necesitan heredar de la clase abstracta

!

SearchComponent !

del paquete org.apache.solr.handler.component

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.

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.

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

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); } }

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)

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

llave/nombre

valor por defecto

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

documentos en cada petición.

demo

mkdir -p solr/collection1/lib

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

!

solr/collection1/lib

<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>

<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

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.

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

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

DocTransformers

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.

Para crear un DocTransformer se

necesitan 2 clases

MyDocTransformer

MyDocTransformerFactory

MyDocTransformerFactory

TransformerFactory

MyDocTransformer

DocTransformer

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

Factory

public void init(NamedList args)

método responsable de crear una instancia del DocTransformer

public String getName()

DocTransformer

public void transform( SolrDocument doc, int docid)

añade/quita campos de la instancia de SolrDocument

demo

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

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

solrconfig.xml

getName()

Recommended