Durchsuchbare Dokumentation aufrufen

Zurück zur Dokumentationsübersicht

Attribute mit JavaScript-Handler zum Index hinzufügen

Im Standard werden Metadaten und Attribute eines Objektes im Suchindex indiziert. Mit einem JavaScript-Handler können Sie weitere Informationen zum Index hinzufügen.

Dazu werden für jedes Objekt während der Echtzeitindizierung (nach einem Commit) und während des Hintergrund-Indizierungsprozesses eines oder mehrere registrierte JavaScript-Handler aufgerufen.

Die von den JavaScripten generierten Felder sind ausschließlich im Index zu finden. D. h. es kann danach gesucht werden, sie können bei einem Suchergebnis zurückgeliefert werden, und sie können fürs Faceting verwendet werden. Es handelt sich dabei nicht um echte Metadaten.

Achtung: Beeinträchtigung des Systembetriebs durch fehlerhafte Skripte. Mit dem JavaScript greifen Sie direkt in den Echtzeitindizierungsprozess ein. Falls das erstellte Skript Fehler enthält, hat dies direkte Auswirkungen auf alle Benutzer, die mit dem System arbeiten. Testen Sie daher die Skripte grundsätzlich auf einem Testsystem.

Tipp: Sollten Fehler auftauchen, etwa durch ein fehlerhaftes Skript, können Sie Fehler im agorum core support tool im Bereich Search Engine prüfen.

Den JavaScript-Handler registrieren


  1. Öffnen Sie links in der Seitenleiste Administration und dann MetaDB.
  2. Öffnen Sie den Pfad:
    MAIN_MODULE_MANAGEMENT/textindexservice/control/jshandler
  3. Erstellen Sie über  ein MetaDb Bundle mit einem beliebigen Namen.

    Tipp: Ein # vor dem Namen deaktiviert den Eintrag.

  4. Erstellen Sie im Property-Bundle über  die MetaDB-Entrys (siehe MetaDB-Entrys erstellen).

    Hinweis: Beim Hinzufügen oder Ändern eines MetaDB-Entrys kann es bis zu 30 Sekunden dauern, bis er geladen wird.

MetaDB-Entrys erstellen

Name Beschreibung Wert (Beispiel)
Script Definiert den vollständigen Pfad zur JavaScript-Datei innerhalb von agorum core. /agorum/roi/textindexservice/jshandler/textindex-segmented-name.js
Selector (optional) Ruft das JavaScript nur bei Objekten auf, die zum Selektor passen. [isFolder]

JavaScript


Im Standard existiert bereits ein Handler für die Konvertierung des Attributes name in ag_segmented_name. In diesem werden alle Sonderzeichen bis auf Buchstaben und Zahlen durch Blanks ersetzt, um die Suche nach Namen zu erleichtern.


Inhalt des Skripts

/* global sc, object, attributes */

let name = attributes.name;

let ret = {};

if (name) {
  name = new java.lang.String(name);
  name = name.replaceAll('[^\\p{L}\\p{N}]+', ' ');
  ret['ag_segmented_name:string'] =  name;
}

ret;


Übergabeparameter

Parameter Beschreibung
sc sessionController
object Objekt, das gerade indiziert wird.
attributes Liste von Attributen, die an die Suchmaschine zur Indizierung übergeben werden würde. Diese enthält alle Attribute und Metadaten in lowercase-Schreibweise.

Hinweis: Verwenden Sie die bereits ausgelesenen Attribute aus attributes. Dies ist performancetechnisch besser, als die Werte nochmals aus object zu laden. Beachten Sie dabei, dass die Namen in attributes kleingeschrieben sind.

Achten Sie allgemein darauf, dass die Skripte zügig laufen, da dadurch sonst ein direkter Einfluss auf ein Commit stattfindet. Für umfangreichere Änderungen verwenden Sie einen Worker.

Als Rückgabe wird eine Map zurückgeliefert:

 ret

Die Rückgabe Map enthält den oder die Attributnamen, die dem Index zugeführt werden. Die Namen müssen grundsätzlich kleingeschrieben sein. Zudem wird ein Datentyp angegeben.

Mögliche Werte sind:

Als Wert wird der gewünschte Wert zurückgegeben. Als Wert kann auch ein Array zurückgegeben werden.

Ein Attribut kann auch überladen werden, indem derselbe Name vergeben wird. Soll ein Attribut entfernt werden, wird der Name des gewünschten Attributes angegeben und als Wert null.

Beispiele


Das createDate in Tag, Monat und Jahr aufteilen

/* global sc, object, attributes */

let templates = require('common/templates');
let date = attributes.createdate;

let ret = {};

// extract the date parts and set them individually
if (date) {
  ret['ag_jstest_year:string'] =  templates.fill('${createdate:yyyy}', { createdate: date }, null);
  ret['ag_jstest_month:string'] =  templates.fill('${createdate:MM}', { createdate: date }, null);
  ret['ag_jstest_day:string'] =  templates.fill('${createdate:dd}', { createdate: date }, null);
}
ret;

Dieses Beispiel erstellt, basierend auf dem Attribut createDate, 3 weitere Felder: 

Ein Attribut aus dem Index entfernen

/* global sc, object, attributes */

let ret = {
  'name:string': null
};

ret;

Dieses Skript entfernt das Attribut name aus dem Index. Das Vorgehen ist nicht zu empfehlen.

Ein Datum erzeugen

/* global sc, object, attributes */

let ret = {
  'ag_jstest_date:date': new Date()
};

ret;

Kombinierte Beispiele

/* global sc, object, attributes */

let templates = require('common/templates');
let date = attributes.createdate;

let ret = {};

// extract the date parts and set them individually
if (date) {
  ret['ag_jstest_year:string'] =  templates.fill('${createdate:yyyy}', { createdate: date }, null);
  ret['ag_jstest_month:string'] =  templates.fill('${createdate:MM}', { createdate: date }, null);
  ret['ag_jstest_day:string'] =  templates.fill('${createdate:dd}', { createdate: date }, null);
}

// test for a date
ret['ag_jstest_date:date'] =  new Date();

// test for a string array
ret['ag_jstest_stringarray:string'] =  [
  'value1',
  'value2',
  'value3'
];

// test for a boolean
ret['ag_jstest_boolean:bool'] =  true;

// test for a double array
ret['ag_jstest_doublearray:double'] =  [
  1.0,
  1.1,
  2.3
];

// test for a date array
ret['ag_jstest_datearray:date'] =  [
  new Date(),
  new Date(),
  new Date(0)
];

ret;

Hinweis: Verwenden Sie für die Namen der Attribute grundsätzlich ein eindeutiges Präfix, um Konflikte mit anderen vorhandenen Attributen zu vermeiden.

Vorhandene Objekte reindizieren


Wenn Sie nachträglich ein Index-Feld über ein JavaScript hinzugefügt haben, möchten Sie vermutlich auch alle vorhandenen Objekte reindizieren lassen, sodass diese die Änderung mitbekommen.

Verwenden Sie dazu einen QueryScript-Worker.

Als Query geben Sie die Objekte an, die das gewünschte Feld noch nicht besitzen, etwa das Feld ag_segmented_name.

In diesem Fall würde die Query für den Worker folgendermaßen aussehen:

allfields:name NOT allfields:ag_segmented_name

Diese findet alle Objekte mit einem Namen, die nicht das Feld ag_segmented_name besitzen.

Als Skript werden die gefundenen Objekte der Indizierung zugeführt:

/* global data */

let objects = require('common/objects');

objects.reIndex(objects.find(data.uuid));