Conferencia 2: El esquema

44
Schema/Esquema

Transcript of Conferencia 2: El esquema

Page 1: Conferencia 2: El esquema

!

Schema/Esquema

Page 2: Conferencia 2: El esquema

?

Page 3: Conferencia 2: El esquema

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

Estructura y Análisis textual

Page 4: Conferencia 2: El esquema

conf/schema.xml

Page 5: Conferencia 2: El esquema

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

Page 6: Conferencia 2: El esquema

Field Types

Page 7: Conferencia 2: El esquema

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

Sintaxisidentificador

clase la definición del tipo de dato

atributos adicionales, dependen de la clase

Page 8: Conferencia 2: El esquema

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

!

Page 9: Conferencia 2: El esquema

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

Page 10: Conferencia 2: El esquema

⚒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

Page 11: Conferencia 2: El esquema

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

Page 12: Conferencia 2: El esquema

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

Page 13: Conferencia 2: El esquema

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

Page 14: Conferencia 2: El esquema

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

Page 15: Conferencia 2: El esquema

Numeric

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

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

Page 16: Conferencia 2: El esquema

<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

Page 17: Conferencia 2: El esquema

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

Page 18: Conferencia 2: El esquema

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)

Page 19: Conferencia 2: El esquema

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"

Page 20: Conferencia 2: El esquema

Fields

Page 21: Conferencia 2: El esquema

<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

Page 22: Conferencia 2: El esquema

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

Page 23: Conferencia 2: El esquema

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

Page 24: Conferencia 2: El esquema

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

Page 25: Conferencia 2: El esquema

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.

Page 26: Conferencia 2: El esquema

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.

Page 27: Conferencia 2: 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!

Page 28: Conferencia 2: El esquema

<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

Page 29: Conferencia 2: El esquema

Análisis del texto

Page 30: Conferencia 2: El esquema

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

Page 31: Conferencia 2: El esquema

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

Page 32: Conferencia 2: El esquema

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.

Page 33: Conferencia 2: El esquema

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

Page 34: Conferencia 2: El esquema

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

Page 35: Conferencia 2: El esquema

Filters de Solr• ASCIIFoldingFilterFactory:

Lleva los tokens a su representación ASCII.

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

Page 36: Conferencia 2: El esquema

EjemploEste es mi primer tweet. Que bien, UCI!

StandardTokenizer

Este es mi primer tweet

Que bien

LowerCaseFilterFactory

UCI

Page 37: Conferencia 2: El esquema

este es mi primer tweet

que bien uci

SynonymFilterFactory

este es mi primer tweet

que bien uci universidad

Page 38: Conferencia 2: El esquema

este es mi primer tweet

que bien uci universidad

StopFilterFactory

este es mi primer tweet

que bien uci universidad

Page 39: Conferencia 2: El esquema

primer tweet

uci universidad

tokens que son finalmente indexados

primer tweet

uci universidad

prim

univer

PorterStemFilterFactory

raízes de los términos

Page 40: Conferencia 2: El esquema

Página de análisis

Page 41: Conferencia 2: El esquema

analizadores

index query

Page 42: Conferencia 2: El esquema

<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

Page 43: Conferencia 2: El esquema

demo

Page 44: Conferencia 2: El esquema

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