Conferencia 2: El esquema

Post on 16-Jul-2015

99 views 3 download

Transcript of Conferencia 2: El esquema

!

Schema/Esquema

?

Define la estructura del índice incluyendo los tipos de datos y los campos.

Estructura y Análisis textual

conf/schema.xml

<?xml version="1.0" encoding="UTF-8" ?> <schema version="1.5" name="simplest-solr"> <fieldType name="string" class="solr.StrField"/> ! <field name="id" type="string" indexed="true" stored="true" required=“true"/> ! <uniqueKey>id</uniqueKey> </schema>

tipos de datos / <fieldType/>

campos / <field/> <uniqueKey/>

Field Types

<fieldType name="string" class="solr.StrField" sortMissingLast="true" />

Sintaxisidentificador

clase la definición del tipo de dato

atributos adicionales, dependen de la clase

• El atributo name, solamente determina un identificador, el atributo class y los demás determinan el comportamiento real del fieldType.

• Dentro de Solr todos los fieldTypes son implementados por una clase de Java.

• Cuando el atributo class comienza con “solr” se refiere a las clases de java del paquete: org.apache.solr.schema.

!

Solr provee varios tipos de datos nativos para manejar datos estructurados (números, fechas, geo-localización, texto sin analizar, etc).

⚒FieldType

PrimitiveFieldType AbstractSpatialFieldType TextField

DateField TrieFieldType StrField BoolField

TrieDateField TrieDoubleField

TrieFloatField

TrieIntField

TrieLongField

IntField

FloatField

DoubleField

LongField

datos estructurados (no texto)

lat/long, formas, geohashing

texto que necesita ser analizado

optimizados para rangos

<fieldType name="string" class="solr.StrField" sortMissingLast="true" />

atributos para manipular el ordenamiento

sortMissingFirst="true"

si ambos están en “false” (por defecto): primero en orden ascendente y últimos en orden descendente.

Strings

<fieldType name="string" class=“solr.StrField" />

Es un tipo de datos que Solr almacenará en el índice sin alterar y sin analizar, se almacena tal y como se envía

Dates / Fechas

<fieldType name="date" class=“solr.TrieDateField" precisionStep=“6" positionIncrementGap="0" />

fieldType optimizado para el almacenamiento de fechas. Solr espera las fechas en el formato ISO-8601: yyyy-MM-ddTHH:mm:ssZ

yyyy = 2012 MM = 05 dd = 22 HH = 09 (24-hr clock) mm = 30 ss = 22 Z = UTC Timezone (Z is for Zulu)

Si se envía en otro formato se obtendrá una excepción de validación

Numeric

<fieldType name="int" class=“solr.TrieIntField" precisionStep=“0" positionIncrementGap="0" />

si deseamos evitar la búsqueda por rangos, basta con especificar precisionStep=“0”.

<fieldType name="int" class=“solr.TrieIntField" precisionStep=“8" positionIncrementGap="0" />

valor a indexar: 327,500precisionStep=“8” Operación Término indexado0: valor original 327500 & 0xFFFFFFFF 327500

8 bits menos significativos 327500 & 0xFFFFFF00 327424

16 bits menos significativos 327500 & 0xFFFF0000 262144

24 bits menos significativos 327500 & 0xFF000000 0

Si tomamos el valor anterior 372,500 y 326,800

Operación Término327500 &

0xFFFFFFFF 327500

327500 & 0xFFFFFF00 327424

327500 & 0xFFFF0000 262144

327500 & 0xFF000000 0

Operación Término326800 &

0xFFFFFFFF 326800

326800 & 0xFFFFFF00 326656

326800 & 0xFFFF0000 262144

326800 & 0xFF000000 0

372,500 326,800

omitNorms

En algunas ocasiones nuestros documentos poseen distintas longitudes

!160

"∞

Solr es capaz de “normalizar” dicho valor a la hora de calcular la relevancia (boost a documentos cortos)

es un valor float basado en la norma de la longitud del documento, el boost del documento y el boost del

campo.

omitNorms=“true” !

omitNorms=“false"

Fields

<field name=“screen_name" type="string" indexed=“true" stored="true" required="true" />

Sintaxisidentificador del campo

nombre del tipo de dato declarado en <fieldType>

indica si el campo es obligatorio

indexed stored

Los campos indexados son utilizados para las

búsquedas y para ordenar los resultados

(relevancia), para facetar, etc.

Los campos almacenados se utilizan

para devolver información al cliente, resaltar los términos

(highlighting).

<field name=“links" type="string" indexed=“true" stored="true" multivalued="true" />

Campos multievaluados

Indica que el campo del documento puede contener varios valores, o sea este campo puede recibir un “arreglo” de

valores.

<dynamicField name=“*_ss” type="string" indexed=“true" stored="true" multivalued="true" />

Campos dinámicos

No es necesario especificar el nombre del campo, sino un “patrón” de este acepta cualquier campo que cumpla con

dicho patrón.

screen_name_ss username_ss links_ss

<dynamicField name=“*_ss” type="string" indexed=“true" stored="true" multivalued="true" />

Pero, todos los campos serán del mismo tipo.

CopyFieldsCon Solr, podemos copiar varios campos hacia uno solo, creando una especie de campo “catch-all”. Muy útil cuando se desea tener un prompt de búsqueda sobre todo el esquema.

<field name=“screen_name” type="string" indexed=“true” stored="true" multivalued="true" /> !<field name=“tweet” type="string" indexed=“true” stored="true" multivalued="true" />

¡Buscar en ambos campos!

<field name=“all_text” type="string" indexed=“true” stored="true" multivalued="true" /> !<copyField source=“screen_name” dest=“all_text” /> <copyField source=“screen_name” dest=“all_text” />

definir un nuevo campocopiar de los otros campos

hacia el nuevo

Análisis del texto

solr.TextField

<fieldType name="text" class=“solr.TextField" positionIncrementGap=“0"> <analyzer> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words=“lang/stopwords_en.txt"/> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>

tokenizadorfiltros

Proceso de análisisTexto inicial

Tokenizer

Filters

Filters

token token token token

token token token

token token token token

token token token

produce un stream de tokens a partir del

texto inicial

filtros aplican operaciones

sobre los tokens

Tokenizadores de Solr• WhiteSpaceTokenizer: Genera

tokens a partir de los espacios presentes.

• StandardTokenizer: Parsea de forma inteligente el texto, generando tokens en espacios, signos de puntuación y es capaz de generar URLs, acrónimos y dirección de email.

• KeywordTokenizer: Produce un único token con todo el contenido.

Filters• Transformación: Realiza cambios en el

token, tales como llevarlo a minúsculas, hayar la raíz, etc.

• Inyección de Token: Se añaden nuevos tokens al stream (sinónimos).

• Eliminación de Token: Se eliminan algunos tokens del stream (stopwords).

Filters de Solr• StopFilterFactory: Elimina las

stopwords (palabras sin significado). • SynonymFilterFactory: Permite

añadir sinónimos por términos. • LowerCaseFilterFactory:

Transforma todos los términos en minúsculas.

• PorterStemFilterFactory: Aplica un algoritmo de stemming (obtiene la raíz de los términos).

Filters de Solr• ASCIIFoldingFilterFactory:

Lleva los tokens a su representación ASCII.

• PatternReplaceFilterFactory: Utilizar expresiones regulares para reemplazar secuencias de caracteres.

EjemploEste es mi primer tweet. Que bien, UCI!

StandardTokenizer

Este es mi primer tweet

Que bien

LowerCaseFilterFactory

UCI

este es mi primer tweet

que bien uci

SynonymFilterFactory

este es mi primer tweet

que bien uci universidad

este es mi primer tweet

que bien uci universidad

StopFilterFactory

este es mi primer tweet

que bien uci universidad

primer tweet

uci universidad

tokens que son finalmente indexados

primer tweet

uci universidad

prim

univer

PorterStemFilterFactory

raízes de los términos

Página de análisis

analizadores

index query

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>

diferentes analizadores en diferentes etapas

demo

<?xml version="1.0" encoding="UTF-8" ?> <schema version="1.5" name="sample"> <fieldType name="string" class="solr.StrField"/> <field name="id" type="string" indexed="true" stored="true" required="true"/> <dynamicField name="*" type="string" indexed="true" stored="true" multiValued="true"/> <uniqueKey>id</uniqueKey> </schema>

PONIENDOLO TODO JUNTO