Mit IBM Cloudant Query arbeiten
IBM® Cloudant® for IBM Cloud® Query ist eine deklarative JSON-Abfragesyntax für IBM Cloudant-Datenbanken. Sie können den Indextyp json
oder text
mit IBM Cloudantverwenden.
In den folgenden Fällen können Sie angeben, wie der Index erstellt wird, indem Sie ihm den Typ json
zuordnen:
- Sie wissen genau, welche Daten Sie suchen möchten.
- Sie möchten Speicher- und Verarbeitungsanforderungen auf ein Minimum beschränken.
Für ein Maximum an Flexibilität bei der Suche nach Daten erstellen Sie in der Regel jedoch einen Index vom Typ text
. Indizes vom Typ text
bieten einen einfachen Mechanismus zur automatischen Indexierung aller Felder in
den Dokumenten.
Aufgrund der höheren Flexibilität können Indizes vom Typ text
mehr Zeit bei der Erstellung und mehr Speicherressourcen als Indizes vom Typ json
beanspruchen.
Index erstellen
Sie können einen Index mit einem der folgenden Typen erstellen:
"type": "json"
"type": "text"
Index mit type=json
erstellen
Zum Erstellen eines JSON-Index in der Datenbank $DATABASE
senden Sie eine POST
-Anforderung an /$DATABASE/_index
mit einem JSON-Objekt, das den Index im Anforderungshauptteil beschreibt. Das Feld type
des JSON-Objekts muss auf json
gesetzt sein. Ein JSON-Index kann partitioniert oder global sein. Diese Option wird im Feld partitioned
festgelegt.
Im folgenden Beispiel wird HTTP verwendet, um einen Index vom Typ JSON
anzufordern:
POST /$DATABASE/_index HTTP/1.1
Content-Type: application/json
Im folgenden Beispiel für ein JSON-Objekt wird ein partitionierter Index mit dem Namen foo-partitioned-index
für das Feld mit dem Namen foo
erstellt:
{
"index": {
"fields": ["foo"]
},
"name" : "foo-partitioned-index",
"type" : "json",
"partitioned": true
}
Im folgenden Beispiel für ein JSON-Objekt wird ein globaler Index mit dem Namen bar-global-index
für das Feld mit dem Namen bar
erstellt:
{
"index": {
"fields": ["bar"]
},
"name" : "bar-global-index",
"type" : "json",
"partitioned": false
}
Das folgende Beispiel für eine zurückgegebene JSON-Antwort bestätigt, dass der Index erstellt wurde:
{
"result": "created"
}
Feld | Beschreibung |
---|---|
index |
Felder - Ein JSON-Array mit Feldnamen, das die Sortiersyntax verwendet. Verschachtelte Felder sind ebenfalls zulässig, z. B. person.name . |
ddoc (optional) |
Der Name des Entwurfsdokuments, in dem der Index erstellt wird. Standardmäßig wird jeder Index in einem eigenen Entwurfsdokument erstellt. Indizes können aus Effizienzgründen zu Entwurfsdokumenten gruppiert werden. Allerdings macht eine Änderung an einem Index in einem Entwurfsdokument alle anderen Indizes in demselben Dokument ungültig. |
type (optional) |
Kann json oder text sein. Standardwert: json . |
name (optional) |
Der Name des Index. Wenn kein Name angegeben wird, wird automatisch ein Name generiert. |
partitioned (optional, boolesch) |
Legt fest, ob dieser Index partitioniert ist. Weitere Informationen finden Sie unter Feld partitioned . |
Feld partitioned
Dieses Feld legt fest, ob der erstellte Index ein partitionierter oder globaler Index ist.
Wert | Beschreibung | Anmerkungen |
---|---|---|
true |
Partitionierten Index erstellen. | Kann nur in einer partitionierten Datenbank verwendet werden. |
false |
Globalen Index erstellen. | Kann in jeder Datenbank verwendet werden. |
Der Standardwert für partitioned
richtet sich nach der Einstellung 'Partitioniert' für die Datenbank:
Ist die Datenbank partitioniert? | Standardwert für partitioned |
Zulässige Werte |
---|---|---|
Ja | true |
true , false |
Nein | false |
false |
It's important to reiterate that the default partitioned
value is true
für Indizes, die in einer partitionierten Datenbank erstellt werden. Dieser Standardwert bedeutet, dass der Index nicht zur Erfüllung
globaler Abfragen verwendet werden kann.
Code | Beschreibung |
---|---|
200 | Der Index wurde erfolgreich erstellt oder war in der Datenbank vorhanden. |
400 | Ungültige Anforderung - Der Anforderungshauptteil hat nicht das angegebene Format. |
Index mit type=text
erstellen
Wenn Sie einen einzelnen Textindex erstellen, ist es ein bewährtes Verfahren, die Standardwerte zu verwenden. Allerdings können einige nützliche Indexattribute geändert werden.
Ein Index vom Typ text
kann partitioniert oder global sein. Diese Option wird im Feld partitioned
festgelegt.
Für Volltextindizes (Full Text Indexes - FTIs) muss das Attribut type
auf den Wert text
gesetzt werden.
Die Attribute name
und ddoc
dienen dazu, Indizes zu Entwurfsdokumenten zu gruppieren. Verwenden Sie die Attribute, um mithilfe eines angepassten Zeichenfolgewerts auf Indexgruppen zu verweisen. Wenn für diese Felder
keine Werte angegeben werden, werden sie automatisch mit einem Hashwert gefüllt.
Wenn Sie mehrere Textindizes in einer Datenbank mit demselben Wert für ddoc
erstellen, müssen Sie mindestens den Wert für ddoc
und den Wert für name
kennen. Wenn mehrere Indizes mit demselben Wert für
ddoc
erstellt werden, werden diese Indizes in dasselbe Entwurfsdokument eingefügt. Im Allgemeinen müssen Sie jeden Textindex in ein eigenes Entwurfsdokument einfügen.
Für weitere Informationen, finden Sie im Abschnitt Mehr über text
Indizes.
Im folgenden Beispiel für ein JSON-Dokument wird die Erstellung eines partitionierten Index angefordert:
{
"index": {
"fields": [
{
"name": "Movie_name",
"type": "string"
}
]
},
"name": "Movie_name-text",
"type": "text",
"partitioned": true
}
Im folgenden Beispiel für ein JSON-Dokument wird die Erstellung eines globalen Index angefordert:
{
"index": {
"fields": [
{
"name": "Movie_name",
"type": "string"
}
]
},
"name": "Movie_name-text",
"type": "text",
"partitioned": false
}
Im folgenden Beispiel für ein JSON-Dokument wird die Erstellung eines komplexeren partitionierten Index angefordert:
{
"type": "text",
"name": "my-index",
"ddoc": "my-index-design-doc",
"index": {
"default_field": {
"enabled": true,
"analyzer": "german"
},
"selector": {},
"fields": [
{"name": "married", "type": "boolean"},
{"name": "lastname", "type": "string"},
{"name": "year-of-birth", "type": "number"}
]
},
"partitioned": true
}
Feld index
Das Feld index
enthält Einstellungen, die speziell für Textindizes gelten.
Wenn alle Felder in allen Dokumenten automatisch indexiert werden sollen, verwenden Sie die folgende einfache Syntax:
"index": {}
Der Indexierungsprozess arbeitet Felder in allen Dokumenten in der Datenbank durch.
In der Demo-Datenbank der Beispielfilme sehen Sie ein Beispiel für einen Textindex, der alle Felder und alle Dokumente in einer Datenbank enthält.
Gehen Sie beim Indexieren aller Felder in allen Dokumenten für große Datasets mit Vorsicht vor, da dies eine sehr ressourcenaufwändige Aktivität sein kann.
Im folgenden Beispiel für ein JSON-Dokument wird die Erstellung eines Index aller Felder in allen Dokumenten angefordert:
{
"type": "text",
"index": { }
}
Feld default_field
Der Wert im Feld default_field
gibt an, wie der Operator $text
mit dem Index verwendet werden kann.
Das Feld default_field
enthält zwei Schlüssel:
Schlüssel | Beschreibung |
---|---|
enabled |
Aktiviert oder inaktiviert den Standardfeldindex (default_field index ). Der Standardwert ist true . |
Der Schlüssel analyzer
im Feld default_field
gibt an, wie der Index Text analysiert. Später kann der Index mithilfe des Operators $text
abgefragt werden. Weitere Informationen zu alternativen Analysefunktionen
finden Sie in der Suchdokumentation. Sie können eine andere Analysefunktion auswählen, wenn Dokumente in anderen Sprachen als Englisch indexiert werden oder wenn andere Sonderanforderungen
für die Analysefunktion, wie zum Beispiel das Abgleichen von E-Mail-Adressen, zu berücksichtigen sind.
Wenn das Feld default_field
nicht angegeben wird oder wenn es mit einem leeren Objekt angegeben wird, wird der Standardwert true
angenommen und die Analysefunktion standard
verwendet.
Array fields
Das Array fields
enthält eine Liste von Feldern, die für jedes Dokument indexiert werden müssen. Wenn Sie wissen, dass ein Index nur bestimmte Felder abfragt, kann ein solches Feld dazu verwendet werden, die Größe des Index
zu begrenzen. Für jedes Feld muss darüber hinaus ein Typ angegeben werden, für den indexiert wird. Die zulässigen Typen sind in der folgenden Liste aufgeführt:
"boolean"
"string"
"number"
Feld index_array_lengths
IBM Cloudant Query-Textindizes besitzen eine Eigenschaft mit dem Namen index_array_lengths
. Wenn die Eigenschaft nicht explizit festgelegt wird, gilt der Standardwert true
.
Wenn das Feld auf den Wert true
gesetzt wird, erfordert der Index zusätzlichen Arbeitsaufwand. Dieser Arbeitsaufwand umfasst einen Scan jedes Dokuments auf Arrays und die Erstellung eines Felds, das die Länge für jedes gefundene
Array aufnimmt.
In den folgenden Situationen kann es sinnvoll sein, das Feld index_array_lengths
auf den Wert false
zu setzen:
- Sie müssen die Länge eines Arrays nicht kennen.
- Sie verwenden den Operator
$size
nicht. - Die Dokumente in Ihrer Datenbank sind komplex oder unterliegen nicht vollständig Ihrer Kontrolle. Infolgedessen ist es schwierig, die Auswirkungen der zusätzlichen Verarbeitung zu schätzen, die zum Bestimmen und Speichern der Array-Längen erforderlich wird.
Der Operator $size
erfordert, dass Sie das Feld index_array_lengths
auf true
setzen. Andernfalls funktioniert der Operator nicht.
Im folgenden Beispiel für ein JSON-Dokument werden die vorgeschlagenen Einstellungen zur Optimierung der Leistung auf Produktionssystemen gezeigt:
{
"default_field": {
"enabled": false
},
"index_array_lengths": false
}
Feld partitioned
Dieses Feld bestimmt, ob der erstellte Index ein partitionierter oder globaler Index ist.
Wert | Beschreibung | Anmerkungen |
---|---|---|
true |
Partitionierten Index erstellen. | Kann nur in einer partitionierten Datenbank verwendet werden. |
false |
Globalen Index erstellen. | Kann in jeder Datenbank verwendet werden. |
Der Standardwert für partitioned
richtet sich nach der Einstellung 'Partitioniert' für die Datenbank:
Ist die Datenbank partitioniert? | Standardwert für partitioned |
Zulässige Werte |
---|---|---|
Ja | true |
true , false |
Nein | false |
false |