Fusion arbeitet für Sie: Streaming in einer JavaScript-Bühne

„Merrily, merrily, merrily, merrily, Search is but a Stream…“

Das Konzept des Streaming ist eine relativ neue Funktion in Fusion/Solr. Wie der Begriff schon andeutet, unterscheidet es sich von einer herkömmlichen synchronen Anfrage und Antwort (>). Zunächst einmal wird bei einer Abfrage per Streaming nicht ein einzelnes Antwortobjekt zurückgegeben, sondern ein „Strom“ von Tupel-Objekten (von denen jedes effektiv ein Dokumentergebnis darstellt), die einzeln geparst oder gelesen werden. Streaming mag oberflächlich betrachtet ein kleines Rätsel sein, aber wenn Sie die Grundlagen erst einmal verstanden haben, werden Sie die umfangreichen Möglichkeiten dieser API entdecken.

Also, weiter geht’s: Wir werden die Klasse CloudSolrStream verwenden, die Teil des solrj.io-Pakets von SolrJ ist. Bevor wir uns dem eigentlichen Code zuwenden, gibt es jedoch einige Vorbehalte zu beachten.

  1. Sie müssen „DocValues“ aktivieren, damit der Sortiervorgang ohne Ausnahme abläuft.
  2. Sie können Streaming nicht für Felder verwenden, bei denen „MultiValues“ aktiviert ist.
  3. Aufgrund der Art und Weise, wie sich JavaScript zur Laufzeit verhält, müssen Sie Ihren Prozess in einem separaten Thread laufen lassen, um eine Antwort wirklich zu „streamen“. Hier finden Sie eine Anleitung zum Multithreading von JavaScript mit der Nashorn-Engine.

Im Rahmen dieses Tutorials werden wir uns speziell auf das Streaming beschränken. Also, noch einmal, weiter geht’s:

Der Code:

function (doc) {
    var HashMap = java.util.HashMap;
    var Map = java.util.Map;
    var Tuple = org.apache.solr.client.solrj.io.Tuple;
    var CloudSolrStream = org.apache.solr.client.solrj.io.stream.CloudSolrStream;

    var e = java.lang.Exception;
    var cstream = org.apache.solr.client.solrj.io.stream.CloudSolrStream;
    var props = java.util.Map;
    var zkHost = "localhost:9983"; 
    var collection = "fbo_test";  
    var cstream = null;

    var props = new HashMap();
    try {
      props.put("q", "*:*");
      props.put("qt", "/export");
      props.put("sort", "id asc");
      props.put("fl", "id");
      props.put("rows", "20");
      
      cstream = new CloudSolrStream(zkHost, collection, props);
       cstream.open();
        while(true) {
          
          var tuple = cstream.read();
          if(tuple.EOF) {
              logger.info("BREAK");
             break;
          }

          var fieldA =  tuple.getString("id");
          logger.info(fieldA);
        }


    } catch (e) {
       logger.error(e);
    }
    return doc;
}

Aufschlüsseln

Sie werden einige bekannte Erklärungen am Anfang wiedererkennen:

 
    var HashMap = java.util.HashMap;
    var Map = java.util.Map;
    var Tuple = org.apache.solr.client.solrj.io.Tuple;
    var CloudSolrStream = org.apache.solr.client.solrj.io.stream.CloudSolrStream;

Dies sind die Java-Klassen, die ich verwenden werde (d.h. ‚Importe‘). Von dort aus deklariere ich meine lokalen Variablen:

    var e = java.lang.Exception;
    var cstream = org.apache.solr.client.solrj.io.stream.CloudSolrStream;
    var props = java.util.Map;
    var zkHost = "localhost:9983"; 
    var collection = "fbo_test";  
    var cstream = null;

Technisch gesehen können Sie diese überall deklarieren, solange sie im Anwendungsbereich zugänglich bleiben. Seit ich Nashorn JavaScript verwende, habe ich es mir zur Gewohnheit gemacht, meine Deklarationen auf diese Weise vorzunehmen, um die Transparenz zu gewährleisten. Meiner Meinung nach sorgt dies auch für einen saubereren Code.

Jetzt, da die Variablen deklariert sind, können wir mit der schweren Arbeit beginnen. Eine Anmerkung dazu: Sie werden feststellen, dass‚zkHost‚ und‚collection‚ fett gedruckt sind. Sie werden diese Einstellungen an Ihre Umgebung anpassen müssen.

Als nächstes fügen wir die Eigenschaften unserer Abfrage zu einer HashMap hinzu:

    var props = new HashMap();
    
      props.put("q", "*:*");
      props.put("qt", "/export");
      props.put("sort", "id asc");
      props.put("fl", "id");
      props.put("rows", "20");

Beachten Sie, dass wir den‚Export‚-Handler und nicht den‚Select‚-Handler verwenden. Zwei weitere Dinge sind hier zu beachten:

  1. Das Feld ’sortieren‘ ist für die Streaming-API erforderlich, und das Feld, nach dem sortiert wird, muss ‚DocValues‘ aktiviert haben.
  2. Die im Parameter ‚fl‘ aufgeführten Felder dürfen KEINE ‚MultiValue‘-Felder sein.

Lassen Sie uns nun fortfahren und unser CloudSolrStream-Objekt instanziieren, den Stream öffnen und das Ergebnis auslesen:

cstream = new CloudSolrStream(zkHost, collection, props);
       cstream.open();
    
        while(true) {
          
          var tuple = cstream.read();
          if(tuple.EOF) {
              logger.info("BREAK");
             break;
          }
          // process Tuple result here
          var fieldA =  tuple.getString("id");
          logger.info(fieldA);
        }

 

Sie wissen sofort, ob es ein Problem mit einem Parameter oder Feld gibt, wenn Sie versuchen, ‚open()‘ auf dem Stream aufzurufen. Wenn es ein Problem gibt, wird in Ihrer Anwendung eine IOException angezeigt. Wenn Sie in der solr.log-Ausgabe nachsehen, sehen Sie eine genauere Ausnahme, die das Problem beschreibt.

Wie bereits erwähnt, gibt der Streaming-Client ein Array von Tuple-Objekten zurück, von denen jedes ein einzelnes Ergebnis der Abfrage darstellt.

Abschließende Anmerkung: Es ist wichtig, dass Sie vor der Erstellung Ihrer Sammlung entscheiden, ob Sie die Streaming-API dafür verwenden möchten. Überlegen Sie, nach welchen Feldern Sie sortieren möchten und welche Felder letztendlich zurückgegeben werden. Sie möchten, dass das Schema Ihrer Sammlung die Anforderungen der Streaming-API widerspiegelt.

Das ist alles, was Sie für den Anfang brauchen. Viel Spaß bei der Suche im Stream!

You Might Also Like

Wie Einzelhändler unser Business Analytics Dashboard zur Umsatzsteigerung nutzen

Entdecken Sie, wie führende Einzelhändler das Business Analytics Dashboard von Lucidworks nutzen,...

Read More

Dritte jährliche KI-Benchmarkstudie 2025: Was wir im B2C-E-Commerce sehen

Laden Sie die B2C-KI-Benchmark-Einblicke 2025 von Lucidworks herunter. Werfen Sie einen Blick...

Read More

B2B-KI-Benchmarkstudie 2025: Was wir in den Schützengräben sehen

Laden Sie die B2B-KI-Benchmark-Highlights 2025 von Lucidworks herunter. Sehen Sie sich die...

Read More

Quick Links