Veamos un ejemplo de cómo se haría la carga de un documento y su posterior búsqueda con Solr.

Este ejercicio consistirá en la modificación del Schema de Solr para un Core dado. Se basará en el ejercicio 2 de la Guía de Solr de la web de Solr, pero simplificado, centrándose en los aspectos relacionados con el Schema, cuya función veremos a medida que se desarrolle el ejercicio. Pretende ser pues, una ayuda a la realización de dicho ejercicio, que animamos a seguir. Utilizaremos el mismo archivo que dicho ejercicio, el archivo films, que viene con la colección de archivos de Solr.

Entramos en Solr

Iniciamos Solr tal y como vimos en los ejercicios anteriores:

start Solr

Creamos el Core "films"

Tecleamos:

solr create_core -c films

creación core Solr

No hemos especificado un configset, de manera que nos crea uno por defecto.

Abrimos nuestro navegador y entramos en la interfaz de usuario tecleando:

http://localhost:8983/solr

Si hacemos click en el elemento de menú Core Admin, veremos los detalles del core y donde se han creado:

detalles de Core films

Modificación del Schema de Solr: creacion del campo name

De la forma en que lo hemos creado, estamos dejando que Solr haga una suposición sobre el tipo de campo. Esta suposición es útil en tanto nos permite empezar a emplear Solr sin definir todos los campos. Esta ausencia de Schema en inglés se conoce como “schemaless”, es decir, sin esquema.

¿Qué es un esquema (Schema)?

Un esquema en solr es un archivo de tipo XML que almacena los detalles sobre los campos y los tipos de campo.

También permite almacenar las modificaciones que podemos llegar a hacer a un campo antes de que sea indexado. Por ejemplo, si queremos que a la hora de buscar sea igual si una determinada palabra está en mayúsculas o en minúsculas.

También podemos definir “campos dinámicos” (Dynamic fields), para crear dinámicamente campos de un tipo de campo determinado. Estas reglas también se definen en el Schema.

Modificación del campo name

La información que vamos a cargar es sobre películas, incluyendo su nombre, director, género, etc.

Puesto que la información está ordenada en orden alfabético a partir del campo “nombre del film” (name en inglés), las primeras películas tienen como nombre un número. Concretamente, la primera película se titula “.45”.

Si no indicamos nada, Solr supondrá que este campo es numérico decimal, cuando no queremos que lo sea, ya que daría lugar a errores al indexar títulos que no son numéricos, tipo "Chicken Run" y similares.

Por tanto, lo que haremos es asegurarnos que el campo “name” se interpreta como una variable tipo “cadena” antes de que sea indexada.

field type de name como string

Ahora cargarmos el Document. El campo "name" de dicho documento ahora se interpretará como una cadena y no como un número.

carga documento films
carga documento films

¿Qué hubiera pasado si no hubiéramos hecho esta corrección?

Si no hubieramos hecho esta corrección, entonces no nos habría indexado todas las películas. Es decir, a partir del momento que el campo de nombre de las películas fuera un campo de texto nos daría un error.

Puedes comprobarlo no añadiendo el campo “name” como “text_general”. Verías que entonces sólo indexa las primeras 5 películas, y que a partir de la película llamada “¿Quién es el señor López?” dejarían de indexarse las películas y daría este error:

error por no crear y modificar el campo name del schema Solr

En esta seríe de videos vamos a hacer precisamente eso, indexar MAL el archivo de films-json para que veamos el resultado:

Video 1: Abrimos Solr mediante solr -start

Video 2: Creamos el core Solr "films"

Video 3: Importamos el archivo films.json, pero no modificamos el campo "name" y observamos que no se nos importan todos las películas sino sólo aquellas con el campo "name" como número, pero no las que el campo "name" es una cadena de texto.

Este ejemplo nos demuestra la importancia de hacer las modificaciones pertinentes al archivo managed-schema, ya que en algunos casos, como este, la creación por defecto no nos es conveniente.

Modificación del Schema de Solr: creación campo Copy Field

Antes de empezar a indexar, hemos de hacer un último retoque. En nuestra configuración actual, necesitaríamos definir un campo para cada búsqueda. Para no tener que hacerlo, deberemos determinar un campo que englobe todo, es decir, un campo que coja los datos de todos los campos y los indexe en un campo llamado _text_

En la pantalla de Interfaz de usuario Administrador, le damos click a Add Copy Field y teclearemos:

crear copy field en Schema Solr

Y ahora ya podemos indexar los datos.

Indexar archivo una vez el Schema ha sido preparado

Indexaremos, procedimiento que también podríamos llamar "importaremos", los datos del archivo film.json, que vienen con los archivo de ejemplo de Solr

importacion archivo films en solr

Alternativamente, para cargar el archivo podríamos haber tecleado:

Solr-8.1.0>java -jar -Dc=films -Dauto example\exampledocs\post.jar example\films\*.json

Con las dos modificaciones que hemos hecho del Schema, hemos logrado dos cosas:

1.- Que se importen/indexen todas las películas del archivo films.json, incluso las que tienen formato de cadena de texto.

2.- Que podamos buscar una palabra dada en cualquier campo que aparezca, no teníendonos que ceñir a un campo específico.

Vamos a comprobarlo:

Primero, hacemos una query de todos los títulos, y veremos que se han indexado las 1.100 películas del archivo filsm.json:

indexado en solr del archivo films.json

Así pues, el campo “name” es indexado como una “string” (cadena) y no como un número.

Esto lo podemos confirmar si hacemos click en la pestaña Schema, y buscamos el campo “name”, donde se observa que el campo name está almacenado efectivamente como “text_general”.

Podemos ver también que este campo ha sido copiado a uno genérico llamado _text_, tal y como le dijimos:

creacion campo copy field en Solr

Vamos a hacer una búsqueda más específica, por ejemplo de las películas en las que aparece en uno u otro campo la palabra “Washington”, y este es el resultado:

busqueda del token Washinton en Solr

Observamos que la palabra “Washington” aparece dos veces, una en el campo “directed by”, ”Denzel Washington”, y otra en el campo “name”, “George Washington”.

Aparecen los resultados independientemente del campo debido a que hemos creado un “Copy Field” que copia los datos de todos los campos.

Y con esto damos por finalizado el ejercicio relativo a la modificación del Schema, cómo lo hacemos y por qué lo hacemos.