Commits et recherche NRT dans SolrCloud

Commits et NRT Search dans SolrCloud

1. Vue d'ensemble

Solr est l’une des solutions de recherche les plus populaires basée sur Lucene. Il est rapide, distribué, robuste, flexible et repose sur une communauté de développeurs active. SolrCloud is the new, distributed version of Solr.

One of its key features here is the near real-time (NRT) search, c'est-à-dire que les documents sont disponibles pour la recherche en tant quesoon lorsqu'ils sont indexés.

2. Indexation dans SolrCloud

Une collection dans Solr est composée de plusieurs fragments, chaque fragment ayant plusieurs répliques. L'une des répliques d'un fragment est sélectionnée en tant que leader pour ce fragment lors de la création d'une collection:

  • Lorsqu'un client tente d'indexer un document, le document se voit d'abord attribuer une partition basée sur le hachage desid du document

  • Le client obtient l'URL du leader de ce fragment de zookeeper, et finalement, la demande d'index est faite à cette URL.

  • Le leader de la partition indexe le document localement avant de l'envoyer aux réplicas.

  • Une fois que le chef de file reçoit un accusé de réception de toutes les répliques actives et en cours de récupération, il envoie une confirmation à l'application cliente d'indexation.

When we index a document in Solr, it doesn’t go to the index directly. It’s written in what is called a tlog (transaction log). Solr utilise le journal des transactions pour s'assurer que les documents ne sont pas perdus avant leur validation, en cas de panne du système.

Si le système se bloque avant que les documents du journal des transactions ne soient validés, c’est-à-dire qu’ils persistent sur le disque, le journal des transactions est relu à la reprise du système, ce qui entraîne zéro perte de documents.

Chaque demande d'index / de mise à jour est enregistrée dans le journal des transactions qui continue de croître jusqu'à ce que nous émettions un commit.

3. S'engage dans SolrCloud

Une opérationcommit signifie finaliser une modification et conserver cette modification sur le disque. SolrCloud fournit deux types d'opérations de validation, à savoir. un commit et un soft commit.

3.1. Commit (Hard Commit)

Une validation ou une validation ferme est une opération dans laquelle Solr vide tous les documents non validés d'un journal de transactions sur le disque. The active transaction log is processed, and then a new transaction log file is opened.

Il actualise également un composant appelé chercheur afin que les documents récemment validés deviennent disponibles pour la recherche. Un chercheur peut être considéré comme une vue en lecture seule de tous les documents validés de l'index.

L'opération de validation peut être effectuée exclusivement par le client en appelant l'APIcommit:

String zkHostString = "zkServer1:2181,zkServer2:2181,zkServer3:2181/solr";
SolrClient solr = new CloudSolrClient.Builder()
  .withZkHost(zkHostString)
  .build();
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField("id", "123abc");
doc1.addField("date", "14/10/2017");
doc1.addField("book", "To kill a mockingbird");
doc1.addField("author", "Harper Lee");
solr.add(doc1);
solr.commit();

De manière équivalente, il peut être automatisé en tant queautoCommit en le spécifiant dans le fichiersolrconfig.xml, voir section 3.4.

3.2. SoftCommit

Softcommit a été ajouté à partir de Solr 4, principalement pour prendre en charge la fonctionnalité NRT de SolrCloud. Il s’agit d’un mécanisme permettant de rechercher des documents en temps quasi réel en évitant les aspects coûteux des validations matérielles.

During a softcommit, the transaction log is not truncated, it continues to grow. However, a new searcher is opened, ce qui rend les documents depuis le dernier softcommit visibles pour la recherche. De plus, certains des caches de niveau supérieur de Solr sont invalidés, ce n'est donc pas une opération entièrement gratuite.

Lorsque nous spécifions lesmaxTime pour softcommit comme 1000, cela signifie que le document sera disponible dans les requêtes au plus tard 1 seconde à partir du moment où il a été indexé.

Cette fonctionnalité permet à SolrCloud de disposer de la puissance de la recherche en temps quasi réel, car les nouveaux documents peuvent être rendus consultables même sans les valider. Softcommit ne peut être déclenché qu'en tant queautoSoftCommit en le spécifiant dans le fichier solrconfig.xml, voir section 3.4.

3.3. Autocommit et Autosoftcommit

Le fichiersolrconfig.xml est l'un des fichiers de configuration les plus importants de SolrCloud. Il est généré au moment de la création de la collection. Pour activerautoCommit ouautoSoftCommit, nous devons mettre à jour les sections suivantes dans le fichier:


  10000
  30000
  true



  6000
  1000

maxTime: Le nombre de millisecondes depuis la première mise à jour non validée après laquelle la prochaine validation / softcommit doit avoir lieu.

maxDocs: Le nombre de mises à jour qui se sont produites depuis le dernier commit et après lequel le prochain commit / softcommit devrait avoir lieu.

openSearcher: Cette propriété indique à Solr s'il faut ouvrir un nouveau chercheur après une opération de validation ou non. If it’s true, after a commit, the old searcher is closed, and a new searcher is opened, making the committed document visible for searching, s'il s'agit defalse, le document ne sera pas disponible pour la recherche après la validation.

La recherche en temps quasi réel est réalisée dans Solr en combinant commit et softcommit. Comme mentionné précédemment, lorsqu'un document est ajouté à Solr, il ne sera pas visible dans les résultats de la recherche tant qu'il n'aura pas été enregistré dans l'index.

Les commits normaux sont coûteux, c'est pourquoi les softcommits sont utiles. Mais, comme softcommit ne conserve pas les documents, nous devons définir l'intervalle de l'autocommitmaxTime (oumaxDocs) à une valeur raisonnable, en fonction de la charge attendue.

4.1. Gets en temps réel

Il existe une autre fonctionnalité fournie par Solr qui est en fait le temps réel - l'APIget. The get API can return us a document that is not even soft committed yet.

Il recherche directement dans les journaux des transactions si le document n'est pas trouvé dans l'index. Nous pouvons donc déclencher un appel d'APIget, immédiatement après le retour de l'appel d'index, et nous pourrons toujours récupérer le document.

Cependant, comme toutes les bonnes choses, il y a un problème ici. We need to pass the id of the document in the get API call. Bien sûr, nous pouvons fournir d'autres requêtes de filtrage avec lesid, mais sansid, l'appel ne fonctionne pas:

http://localhost:8985/solr/myCollection/get?id=1234&fq=name:example

5. Conclusion

Solr nous offre un peu de flexibilité en ce qui concerne l’ajustement de la capacité NRT. Pour obtenir les meilleures performances du serveur, nous devons expérimenter les valeurs de commits et softcommits, en fonction de notre cas d'utilisation et de la charge attendue.

We shouldn’t keep our commit interval too long, or else our transaction log will grow to a considerable size. Cependant, nous ne devons pas exécuter nos softcommits trop fréquemment.

Il est également conseillé de tester correctement les performances de notre système avant de passer en production. Nous devrions vérifier si les documents sont en train de devenir interrogeables dans l'intervalle de temps souhaité.