¿Qué es Apache Solr? Y por que deberías usarlo

Apache Solr es un subproyecto de Apache Lucene, que es la tecnología de indexación detrás de la tecnología de búsqueda e indexación creada más recientemente. Solr es un motor de búsqueda en el fondo, pero es mucho más que eso. Es una base de datos NoSQL con soporte transaccional. Es una base de datos de documentos que ofrece soporte SQL y lo ejecuta de manera distribuida.

¿Suena interesante? Únase a mí para verlo más de cerca. (Divulgación completa: trabajo para Lucidworks, que emplea a muchos de los contribuyentes clave del proyecto Solr).

Necesita una máquina decente (o simplemente use una instancia de AWS) con, idealmente, 8 GB o más de RAM. Puede encontrar Solr en //lucene.apache.org/solr. También necesita la versión 8 de la máquina virtual Java. Descomprima / descomprima Solr en un directorio, asegúrese de que JAVA_HOME esté configurado y de que el binario de Java esté en su ruta. Cambie al directorio en el que se encuentra Solr y escriba bin/solr start -e cloud -noprompt. Esto inicia un clúster de dos nodos en su computadora portátil con una colección de muestra llamada Gettingstarted ya cargada.

Un inicio normal sería simplemente bin/solr start -ciniciar Solr en modo "nube". Pero si va a patear los neumáticos, realmente desea ver una instalación de múltiples nodos, incluso si es en su propia computadora portátil. Solr Cloud es la forma en que desea ejecutar una instalación moderna de Solr. Si comienza sin el -c, comenzará en modo heredado. Eso es malo.

Documentos y colecciones

Solr es una base de datos estructurada de documentos. Las entidades como "Persona" se componen de campos como nombre, dirección y correo electrónico. Estos documentos se almacenan en colecciones. Las colecciones son el análogo más cercano a las tablas en una base de datos relacional. Sin embargo, a diferencia de una base de datos relacional, "Persona" puede contener completamente la entidad, lo que significa que si una persona tiene varias direcciones, esas direcciones pueden almacenarse en un documento de "Persona". En una base de datos relacional, necesitaría una tabla de direcciones separada.

Persona {

 "Id": "1333425",

 "First_name": "Francis",

 "Middle_name": "J.",

 "Last_name": "Underwood",

 "Dirección": ["1600 Pennsylvania Ave NW, Washington, DC 20500", "1609 Far St. NW, Washington, DC, 20036"],

 "Teléfono": ["202-456-1111", "202-456-1414"]

}

Fragmentos, réplicas y núcleos

A diferencia de la mayoría de las bases de datos relacionales, los datos se fragmentan y replican automáticamente a través de Solr Cloud. Esto significa que cuando escribe un documento en una colección configurada correctamente, se distribuye a una de las instancias de Solr. Eso es "fragmentación". Se hace para mejorar el rendimiento de lectura. Cada documento también se replica o copia al menos una vez (configurable) para redundancia. Esto significa que puede perder una instancia de Solr y sufrir solo un rendimiento reducido en su clúster, pero sin pérdida de datos.

Un clúster es un conjunto de "nodos", que son instancias de Java Virtual Machine (JVM) que ejecutan Solr. Un nodo puede contener varios "núcleos". Cada núcleo es una réplica de un "fragmento" lógico. Generalmente, los núcleos se identifican por la colección, el número de fragmento y el número de réplica concatenados juntos como una cadena.

Creando una colección

Aunque existen interfaces HTTP similares a REST, puede usar el comando bin/solr(o bin/solr.cmd) para crear y controlar colecciones. Usemos un tema no controvertido y busquemos un conjunto de datos públicos. Obtenga una copia de los datos de costos de atención médica de Data.gov. En aras de la simplicidad, consíguelo como CSV. Suponiendo que inició Solr como se le indicó, use este comando para crear una colección llamada ipps:

bin / solr create_collection -d basic_configs -c ipps

A continuación, carguemos datos en la colección. Primero tenemos que arreglar algunas cosas en el archivo CSV. Elimina todos los $personajes. Además, en la fila superior de nombres de campo, cambie los campos de espacios a guiones bajos. Haz que se lea así:

DRG_Definition, Provider_Id, Provider_Name, Provider_Street_Address, Provider_City, Provider_State, Provider_Zip_Code, Hospital_Referral_Region_Description, Total_Discharges, Average_Covered_Charges, Average_Total_Payments, Average_Medicare_Payments

Hay herramientas más poderosas para ETL que las integradas en Solr (como la integrada en el producto que vende mi empresa), pero en general, ¡esta no fue una solución complicada!

Sin embargo, antes de cargar cualquier dato, necesitamos crear un "esquema" que sea similar al que tiene en una base de datos relacional. Podemos hacer eso con el curlcomando en Linux / Mac o puede usar una herramienta GUI como Postman.

curl -X POST -H 'Tipo de contenido: aplicación / json' —data-binary '{

 "Agregue campo":{

     "Nombre": "DRG_Definition",

     "Tipo": "text_general",

     "Indexado": verdadero,

     "Almacenado": verdadero

  },

 "Agregue campo":{

     "Nombre": "Provider_Id",

     "Tipo": "plong",

     "DocValues": verdadero,

     "Indexado": verdadero,

     "Almacenado": verdadero

  },

 "Agregue campo":{

     "Nombre": "Provider_Name",

     "Tipo": "text_general",

     "Indexado": verdadero,

     "Almacenado": verdadero

  },

 "Agregue campo":{

     "Nombre": "Provider_Street_Address",

     "Tipo": "cadena",

     "Indexado": falso,

     "Almacenado": verdadero

  },

 "Agregue campo":{

     "Nombre": "Provider_City",

     "Tipo": "cadena",

     "Indexado": verdadero,

     "Almacenado": verdadero

  },

 "Agregue campo":{

     "Nombre": "Provider_State",

     "Tipo": "cadena",

     "Indexado": verdadero,

     "Almacenado": verdadero

  },

 "Agregue campo":{

     "Nombre": "Provider_Zip_Code",

     "Tipo": "cadena",

     "Indexado": verdadero,

     "Almacenado": verdadero

  },

 "Agregue campo":{

     "Nombre": "Hospital_Referral_Region_Description",

     "Tipo": "text_general",

     "Indexado": verdadero,

     "Almacenado": verdadero

  },

 "Agregue campo":{

     "Nombre": "Total_Discharges",

     "Tipo": "pinta",

     "DocValues": verdadero,

     "Indexado": verdadero,

     "Almacenado": verdadero

  },

 "Agregue campo":{

     "Name": "Average_Covered_Charges",

     "Tipo": "pdouble",

     "DocValues": verdadero,

     "Indexado": verdadero,

     "Almacenado": verdadero

  },

 "Agregue campo":{

     "Name": "Average_Total_Payments",

     "Tipo": "pdouble",

     "DocValues": verdadero,

     "Indexado": verdadero,

     "Almacenado": verdadero

  },

 "Agregue campo":{

     "Nombre": "Average_Medicare_Payments",

     "Tipo": "pdouble",

     "DocValues": verdadero,

     "Indexado": verdadero,

     "Almacenado": verdadero

  }

} '// localhost: 8983 / solr / ipps / schema

Estos son nombres de campo, tipos de campo y si indexar y almacenar el campo o no. Puede obtener más información sobre los tipos de datos de Solr y el esquema general en la guía de referencia.

Now that we’ve got a schema we can “post” the data into Solr. There are many routes to do this. You could use curl or Postman, but Solr includes a command line tool, bin/post, which will be available out of the box on Linux and MacOS.

bin/post -c ipps -params "rowid=id" -type "text/csv" /home/acoliver/Downloads/Inpatient_Prospective_Payment_System__IPPS__Provider_Summary_for_the_Top_100_Diagnosis-Related_Groups__DRG__-_FY2011.csv

On Windows:

java -Dtype=text/csv -Dc=ipps -Dparams="rowid=id" -jar example\exampledocs\post.jar \Users\acoliver\Downloads\Inpatient_Prospective_Payment_System__IPPS__Provider_Summary_for_the_Top_100_Diagnosis-Related_Groups__DRG__-_FY2011.csv

W00t you have data!

Querying your data

There are language bindings for Solr that you can use for Java or Python, or if you’re more of a power developer you can use the one for PHP. Or you could just use curl or Postman or your browser.

Paste this into an address bar:

//localhost:8983/solr/ipps/select?indent=on&q=*:*&wt=json

This URL is a simple query that returns the 10 most relevant results. You can change the pagination and find out more about Solr’s Solr’s query language and even alternative query parsers in the reference guide. If you want to see the same thing in XML you can configure that.

Maybe you want to do something a bit more advanced. Below finds procedures in the town I live in:

//localhost:8983/solr/ipps/select?indent=on&q=Provider_State:NC%20AND%20Hospital_Referral_Region_Description:%22*Durham%22&wt=json

You can go much further and do more summaries and calculations and fuzzy matches.

Solr administration

Some of you are like “Good gosh, the command line scares me!” So that’s fine, Solr has a GUI. Got to //localhost:8983/solr and see this beauty:

If you select your collection on the side, you can even go to a screen that will let you fill in query parameters:

If that screen gives you a headache, you can just go to //localhost:8983/solr/ipps/browse.

We’ve done simple text queries. You can also do ranges and spatial searches. If the “relevance” sorting isn’t working for you, you can do more advanced expressions and have Solr return things “as they are found” much like an RDBMS does it. You can sort on various fields and filter by categories. You can even have it “learn to rank”—a machine learning capability that lets Solr “learn” what users think is the most relevant result. We’ve really only scratched the surface.

Why Solr?

So clearly you might choose to use Solr if you need a search engine. However, it is also a redundant, distributed document database that offers SQL (out of the box) for those who want to connect tools like Tableau. It is extensible in Java (and other JVM languages), and yet with the REST-like interface you can easily speak JSON or XML to it.

Es posible que Solr no sea su mejor opción si tiene datos simples que busca por clave y sobre los que escribe principalmente. Solr tiene demasiada plomería para hacer cosas más grandes y ser tan eficiente como una tienda de valor clave.

Solr es una opción clara si su búsqueda está muy centrada en el texto. Sin embargo, hay otros casos no tan obvios en los que podría ser una buena opción, como las búsquedas espaciales en todas aquellas personas cuyos teléfonos celulares hackeado para rastrear su ubicación. Solo digo que usted, Sr. Putin, podría querer elegir a Solr también.

Independientemente, recuerde que los amigos no permiten que sus amigos hagan bla like '%stuff' consultas SQL .