Qu'est-ce qu'Apache Solr? Et pourquoi vous devriez l'utiliser

Apache Solr est un sous-projet d'Apache Lucene, qui est la technologie d'indexation derrière la technologie de recherche et d'indexation la plus récemment créée. Solr est un moteur de recherche dans l'âme, mais c'est bien plus que cela. C'est une base de données NoSQL avec un support transactionnel. Il s'agit d'une base de données de documents qui offre un support SQL et qui l'exécute de manière distribuée.

A l'air intéressant? Rejoignez-moi pour un examen plus approfondi. (Divulgation complète: je travaille pour Lucidworks, qui emploie de nombreux contributeurs clés au projet Solr.)

Vous avez besoin d'une machine décente (ou utilisez simplement une instance AWS) avec idéalement 8 Go ou plus de RAM. Vous pouvez trouver Solr sur //lucene.apache.org/solr. Vous avez également besoin de la version 8. de la machine virtuelle Java. Décompressez / décompressez Solr dans un répertoire, assurez-vous que JAVA_HOME est défini et que le binaire java est dans votre chemin. Accédez au répertoire dans lequel se trouve Solr et saisissez bin/solr start -e cloud -noprompt. Cela démarre un cluster à deux nœuds sur votre ordinateur portable avec une collection d'exemples appelée gettingstarted déjà chargée.

Un démarrage normal serait simplement bin/solr start -cde démarrer Solr en mode «cloud». Mais si vous voulez vous débarrasser des pneus, vous voulez vraiment voir une installation multi-nœuds même si c'est sur votre propre ordinateur portable. Solr Cloud est la manière dont vous souhaitez exécuter une installation Solr moderne. Si vous démarrez sans le, -cvous commencerez en mode hérité. C'est une mauvaise chose.

Documents et collections

Solr est une base de données structurée de documents. Les entités telles que «Personne» sont composées de champs tels que le nom, l'adresse et l'adresse e-mail. Ces documents sont stockés dans des collections. Les collections sont l'analogue le plus proche des tables d'une base de données relationnelle. Cependant, contrairement à une base de données relationnelle, «Personne» peut contenir complètement l'entité, ce qui signifie que si une personne a plusieurs adresses, ces adresses peuvent être stockées dans un seul document «Personne». Dans une base de données relationnelle, vous avez besoin d'une table d'adresses distincte.

La personne {

 "Id": "1333425",

 "First_name": "Francis",

 "Deuxième_nom": "J.",

 «Last_name»: «Underwood»,

 «Adresse»: [«1600 Pennsylvania Ave NW, Washington, DC 20500», «1609 Far St. NW, Washington, DC, 20036»],

 «Téléphone»: [«202-456-1111», «202-456-1414»]

}

Éclats, répliques et noyaux

Contrairement à la plupart des bases de données relationnelles, les données sont automatiquement partitionnées et répliquées via Solr Cloud. Cela signifie que lorsque vous écrivez un document dans une collection correctement configurée, il est distribué à l'une des instances Solr. C'est du «sharding». Ceci est fait pour améliorer les performances de lecture. Chaque document est également répliqué ou copié au moins une fois (configurable) pour la redondance. Cela signifie que vous pouvez perdre une instance Solr et ne subir que des performances réduites sur votre cluster, mais aucune perte de données.

Un cluster est un ensemble de «nœuds», qui sont des instances de machine virtuelle Java (JVM) exécutant Solr. Un nœud peut contenir plusieurs «cœurs». Chaque cœur est une réplique d'un «fragment» logique. En général, les cœurs sont identifiés par la collection, le numéro de partition et le numéro de réplique concaténés sous forme de chaîne.

Créer une collection

Bien qu'il existe des interfaces HTTP de type REST, vous pouvez simplement utiliser la commande bin/solr(ou bin/solr.cmd) pour créer et contrôler des collections. Utilisons un sujet non controversé et trouvons un ensemble de données public. Récupérez une copie des données sur les coûts des soins de santé sur Data.gov. Par souci de simplicité, saisissez-le au format CSV. En supposant que vous ayez démarré Solr comme indiqué, utilisez cette commande pour créer une collection appelée ipps:

bin / solr create_collection -d bases_configs -c ipps

Ensuite, chargeons les données dans la collection. Nous devons d'abord corriger quelques éléments dans le fichier CSV. Supprimez tous les $caractères. En outre, dans la rangée supérieure des noms de champ, changez les champs d'espaces en traits de soulignement. Faites-le lire comme ceci:

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

Il existe des outils plus puissants pour ETL que ceux intégrés à Solr (comme celui intégré au produit vendu par mon entreprise), mais dans l'ensemble, ce n'était pas une solution compliquée!

Avant de charger des données, nous devons créer un «schéma» similaire à ce que vous avez dans une base de données relationnelle. Nous pouvons le faire avec la curlcommande sous Linux / Mac ou vous pouvez utiliser un outil graphique comme Postman.

curl -X POST -H 'Content-type: application / json' —data-binary '{

 "ajouter le champ":{

     "Nom": "DRG_Definition",

     "Type": "text_general",

     "Indexé": vrai,

     "Stocké": vrai

  },

 "ajouter le champ":{

     "Name": "Provider_Id",

     "Type": "plong",

     “docValues”:true,

     “indexed”:true,

     “stored”:true

  },

 “add-field”:{

     “name”:”Provider_Name”,

     “type”:”text_general”,

     “indexed”:true,

     “stored”:true

  },

 “add-field”:{

     “name”:”Provider_Street_Address”,

     “type”:”string”,

     “indexed”:false,

     “stored”:true

  },

 “add-field”:{

     “name”:”Provider_City”,

     “type”:”string”,

     “indexed”:true,

     “stored”:true

  },

 “add-field”:{

     “name”:”Provider_State”,

     “type”:”string”,

     “indexed”:true,

     “stored”:true

  },

 “add-field”:{

     “name”:”Provider_Zip_Code”,

     “type”:”string”,

     “indexed”:true,

     “stored”:true

  },

 “add-field”:{

     “name”:”Hospital_Referral_Region_Description”,

     “type”:”text_general”,

     “indexed”:true,

     “stored”:true

  },

 “add-field”:{

     “name”:”Total_Discharges”,

     “type”:”pint”,

     “docValues”:true,

     “indexed”:true,

     “stored”:true

  },

 “add-field”:{

     “name”:”Average_Covered_Charges”,

     “type”:”pdouble”,

     “docValues”:true,

     “indexed”:true,

     “stored”:true

  },

 “add-field”:{

     “name”:”Average_Total_Payments”,

     “type”:”pdouble”,

     “docValues”:true,

     “indexed”:true,

     “stored”:true

  },

 “add-field”:{

     “name”:”Average_Medicare_Payments”,

     “type”:”pdouble”,

     “docValues”:true,

     “indexed”:true,

     “stored”:true

  }

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

These are field names, field types, and whether or not to index and store the field. You can find out more about Solr’s data types and overall schema in the reference guide.

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.

Solr n'est peut-être pas votre meilleur choix si vous avez des données simples sur lesquelles vous recherchez par clé et que vous écrivez principalement. Solr a trop de plomberie pour faire de plus grandes choses pour être aussi efficace qu'un magasin à valeur clé.

Solr est un choix clair si votre recherche est très centrée sur le texte. Cependant, il existe d'autres cas pas si évidents où cela pourrait être un bon choix, comme pour les recherches spatiales sur toutes les personnes dont vous avez piraté les téléphones portables pour suivre leur emplacement. Je dis simplement que vous, M. Poutine, voudrez peut-être aussi choisir Solr.

Quoi qu'il en soit, rappelez-vous simplement que les amis ne laissent pas leurs amis faire des bla like '%stuff' requêtes SQL .