IBM Cloudant-Suche verwenden
IBM® Cloudant® for IBM Cloud® Die Suche ermöglicht sprachabhängige Freitext-, Mehrfeld- und einfache Geodatenabfragen, die von Apache Lucene, einer Open-Source-Suchmaschine, unterstützt werden.
IBM Cloudant Die Suche wird verwendet, um flexible Abfragen mit einem, vielen oder allen indizierten Feldern unter Verwendung der Apache Lucene-Abfragesyntax zu erstellen.
So funktioniert die Suche auf IBM Cloudant
Suchindexdefinitionen werden in Entwurfsdokumenten in Form einer JavaScript Funktion gespeichert, die gegen jedes Dokument in der Datenbank ausgeführt wird. Die Funktion definiert, welche Attribute indiziert werden, welche im Index gespeichert werden, aber nicht durchsuchbar sind, und wie jedes Textattribut vor der Indizierung vorverarbeitet wird (unter Verwendung eines ausgewählten Such-"Analyzers").
IBM Cloudant die Suche kann sich auf die gesamte Datenbank oder bei partitionierten Datenbanken auf eine einzelne Partition beziehen, für die options.partitioned im Entwurfsdokument angegeben ist true.
Wann sollte die Suche IBM Cloudant verwendet werden?
IBM Cloudant Die Suche ist ideal für:
- Sprachunterstützte Volltextsuche, Platzhaltersuche und einfache Bereichsabfragen in numerischen oder Textfeldern.
- Flexible Abfragen auf eine Reihe von indizierten Feldern.
- Einfache raumbezogene Abfragen wie die Suche nach dem nächstgelegenen Ort oder die Suche mit einem Begrenzungsrahmen.
- Zählungsaggregationen auf einzelnen Feldern innerhalb der Ergebnismenge - bekannt als "Facettierung".
Wann die Suche IBM Cloudant nicht verwendet werden sollte
Vermeiden Sie IBM Cloudant Suche nach
- Aggregation (anders als Facettierung). Verwenden Sie stattdessen Views.
Aufbau eines Suchindexes
Zum Erstellen eines Suchindex fügen Sie einem Entwurfsdokument in der Datenbank eine JavaScript-Funktion hinzu. Ein Index wird erstellt, wenn eine Suchanforderung verarbeitet wurde oder wenn der Server eine Dokumentaktualisierung erkannt hat.
Die Indexfunktion (Feld index) akzeptiert die folgenden Parameter:
- Feldname - Der Name des Felds, das Sie zum Abfragen des Index verwenden wollen. Wenn Sie diesen Parameter auf den Wert
defaultsetzen, wird dieses Feld abgefragt, wenn in der Abfragesyntax kein Feld angegeben wird. - Daten, die indexiert werden sollen. Beispiel:
doc.address.country. - (Optional) Der dritte Parameter enthält die folgenden Felder:
boost,facet,indexundstore. Diese Felder werden nachfolgend ausführlicher beschrieben.
Eine Suchindexantwort gibt standardmäßig 25 Zeilen zurück. Die Anzahl der Zeilen, die zurückgegeben werden, kann über den Parameter limit geändert werden. Allerdings ist die Ergebnismenge einer Suche auf 200 Zeilen begrenzt. Jede
Antwort enthält ein Feld bookmark (Lesezeichen). Sie können den Wert des Felds bookmark in spätere Abfragen einfügen, um alle Antworten durchzusehen.
Sie können die API mit einer der folgenden Methoden abfragen: URI, IBM Cloudant Dashboard, Curl oder Browser-Plug-in wie Postman oder RESTClient.
Beispiel für ein Entwurfsdokument, das einen Suchindex definiert:
{
"_id": "_design/search_example",
"indexes": {
"animals": {
"index": "function(doc){ ... }"
}
}
}
Partitionierungstyp für Suchindizes
Ein Suchindex übernimmt den Partitionierungstyp aus dem Feld options.partitioned des Entwurfsdokuments, in dem er enthalten ist.
Indexfunktionen
Wenn Sie versuchen, ein Datenfeld zu indexieren, das nicht vorhanden ist, schlägt die Indexierung fehl. Zur Vermeidung dieses Problems verwenden Sie eine entsprechende Wächterklausel.
Ihre Indexierungsfunktionen operieren in einer Umgebung mit begrenztem Speicher, in der das Dokument selbst einen Teil des Speichers bildet, der in dieser Umgebung verwendet wird. Der Stack und das Dokument Ihres Codes muss in diesen Speicher passen. Dokumente sind auf eine maximale Größe von 64 MB begrenzt.
Indexieren Sie innerhalb eines Suchindex nicht denselben Feldnamen mit mehr als einem Datentyp. Wenn derselbe Feldname in derselben Suchindexfunktion mit unterschiedlichen Datentypen indexiert wird, wird ein Fehler angezeigt. Dieser Fehler tritt
auf, wenn Sie den Suchindex abfragen, der das Feld „ was indexed without position data “ enthält. Schließen Sie zum Beispiel nicht beide der folgenden Zeilen in dieselbe Suchindexfunktion ein. Durch diese Zeilen wird das Feld
myfield mit zwei unterschiedlichen Datentypen indexiert: einmal als Zeichenfolge "this is a string" und einmal als Zahl 123.
index("myfield", "this is a string");
index("myfield", 123);
Die Funktion, die in dem Indexfeld enthalten ist, ist eine JavaScript-Funktion, die für jedes Dokument in der Datenbank aufgerufen wird. Die Funktion empfängt das Dokument als Parameter, extrahiert einige Daten aus dem Dokument und ruft dann
die Funktion auf, die im Feld index definiert ist, um die Daten zu indexieren.
Die Funktion index akzeptiert drei Parameter, wobei der dritte Parameter optional ist.
Der erste Parameter ist der Name des Feldes, das Sie bei der Abfrage des Indexes verwenden möchten; dieser wird im Lucene-Syntaxteil der nachfolgenden Abfragen angegeben. Die folgende Abfrage zeigt ein Beispiel:
query=color:red
Der Lucene-Feldname color ist der erste Parameter der Funktion index.
Der Parameter query kann zu q abgekürzt werden, sodass das folgende Beispiel eine alternative Schreibweise für die Abfrage darstellt.
q=color:red
Wenn der Sonderwert "default" beim Definieren des Namens verwendet wird, müssen Sie bei der Abfrage keinen Feldnamen angeben. Das hat den Effekt, dass die Abfrage vereinfacht werden kann:
query=red
Der zweite Parameter gibt die Daten an, die indexiert werden sollen. Berücksichtigen Sie die folgenden Informationen, wenn Sie Ihre Daten indexieren:
- Diese Daten dürfen nur die Typen Zeichenfolge, Zahl oder Boolesch haben. Andere Typen geben einen Fehler aus dem Aufruf der Indexfunktion zurück.
- Wenn während der Ausführung Ihrer Funktion aus diesem Grund oder aus einem anderen ein Fehler zurückgegeben wird, wird das Dokument diesem Suchindex nicht hinzugefügt.
Der dritte, optionale, Parameter ist ein JavaScript-Objekt mit den folgenden Feldern:
| Option | Beschreibung | Werte | Standard |
|---|---|---|---|
boost |
Eine Zahl, die die Relevanz in Suchergebnissen angibt. Inhalte, die mit einem Boostwert größer 1 indexiert werden, sind relevanter als Inhalte, die ohne Boostwert indexiert werden. Inhalte mit einem Boostwert kleiner 1 sind weniger relevant. | Positive Gleitkommazahl | 1 (Kein Boosting) |
facet |
Erstellt einen facettierten Index. Weitere Informationen finden Sie unter Facettierung. | true |
false |
index |
Gibt an, ob die Daten indexiert werden, und wenn dies der Fall ist, wie sie indexiert werden. Bei false können die Daten nicht für Suchen verwendet werden. Sie können jedoch noch aus dem Index abgerufen werden, wenn store auf true gesetzt wird. Weitere Informationen finden Sie unter Analysefunktionen. |
true, false |
true |
store |
Bei true wird der Wert im Suchergebnis zurückgegeben, andernfalls wird der Wert nicht zurückgegeben. |
true, false |
false |
Wenn Sie den Parameter store nicht angeben, werden die Indexdatenergebnisse für das Dokument nicht in der Antwort auf eine Abfrage zurückgegeben.
Beispiel für eine Suchindexfunktion:
function(doc) {
index("default", doc._id);
if (doc.min_length) {
index("min_length", doc.min_length, {"store": true});
}
if (doc.diet) {
index("diet", doc.diet, {"store": true});
}
if (doc.latin_name) {
index("latin_name", doc.latin_name, {"store": true});
}
if (doc.class) {
index("class", doc.class, {"store": true});
}
}
Speichern vs. include_docs=true
Wenn IBM Cloudant Daten nach einer Suche zurückgibt, können Sie eine der folgenden Optionen auswählen: store: true oder include_docs=true. Diese sind nachfolgend beschrieben:
- Wählen Sie bei der Indexierung die Option
{store: true}aus. Diese Option gibt an, dass das betreffende Feld im Index gespeichert werden muss. Ein Feld kann "gespeichert" werden, selbst wenn es für die Indexierung selbst nicht verwendet wird. Beispiel: Eine Telefonnummer kann "gespeichert" werden, selbst wenn der verwendete Suchalgorithmus die Suche anhand einer Telefonnummer nicht umfasst. - Geben Sie bei der Abfrage
?include_docs=truean, um IBM Cloud zu informieren, dass für jedes übereinstimmende Dokument der gesamte Text zurückgegeben werden soll.
Die erste Option bedeutet, dass der Index größer ist, stellt jedoch die schnellste Methode für das Abrufen von Daten dar. Mit der zweiten Option ist der Index kleiner, bei der Abfrage fällt jedoch für IBM Cloud zusätzlicher Aufwand an, da nach der Berechnung des Suchergebnissatzes die Dokumenttexte abgerufen werden müssen. Die Ausführung dieses Prozesses kann mehr Zeit in Anspruch nehmen und bedeutet zusätzlichen Aufwand für den IBM Cloud-Cluster.
Wählen Sie nach Möglichkeit die erste Option unter Beachtung der folgenden Richtlinien:
- Nur die Felder indexieren, die durchsuchbar sein sollen.
- Nur die Felder speichern, die bei einer Abfrage abgerufen werden müssen.
Wächterklauseln für Indizes
Die Funktion index erfordert als zweiten Parameter den Namen des Datenfelds, das indexiert werden soll. Wenn das Datenfeld für das Dokument jedoch nicht vorhanden ist, tritt ein Fehler auf. Die Lösung besteht darin, eine entsprechende
„Guard-Klausel“ zu verwenden, die prüft, ob das Feld vorhanden ist. Diese Klausel prüft den erwarteten Datentyp, bevor überhaupt versucht wird, den entsprechenden Index zu erstellen.
Beispieldefinition, die keinerlei Validierung für den Typ des Indexdatenfelds enthält:
if (doc.min_length) {
index("min_length", doc.min_length, {"store": true});
}
Sie könnten den JavaScript-Operator typeof zur Implementierung des Wächterklauseltests verwenden. Wenn das Feld vorhanden ist und den erwarteten Typ hat, wird der korrekte Typname zurückgegeben. Ist Test der Wächterklausel erfolgreich,
bedeutet dies, dass die Indexfunktion gefahrlos verwendet werden kann. Wenn dieses Feld nicht vorhanden ist, wird nicht der erwartete Typ des Felds zurückgegeben, sodass nicht versucht werden sollte, das Feld zu indexieren.
JavaScript betrachtet ein Ergebnis als falsch, wenn der Test einen der folgenden Werte ergibt:
- 'undefined'
- Null
- Zahl +0
- Zahl -0
- NaN (Nichtzahl)
- "" (leere Zeichenfolge)
Im folgenden Beispiel wird eine Wächterklausel verwendet, um zu prüfen, ob das erforderliche Datenfeld vorhanden ist und eine Zahl enthält, bevor die Indexierung versucht wird:
if (typeof doc.min_length === 'number') {
index("min_length", doc.min_length, {"store": true});
}
Verwenden Sie eine generische Wächterklausel, um sicherzustellen, dass der Typ eines gewünschten Datenfelds definiert ist.
Beispiel für eine "generische" Wächterklausel:
if (typeof doc.min_length) !== 'undefined') {
// The field exists, and does have a type, so we can proceed to index using it.
...
}
Analysefunktionen
Analysefunktionen sind Einstellungen, die definieren, wie Begriffe in einem Text erkannt werden. Weitere Informationen finden Sie unter Suchanalysatoren.
Analysefunktionen können nützlich sein, wenn Sie mehrere Sprachen indexieren müssen.
Die folgende Tabelle zeigt eine Liste von generischen Analysatoren, die von der IBM Cloudant Suche unterstützt werden:
| Analysefunktion | Beschreibung |
|---|---|
classic |
Die Lucene-Standardanalysefunktion (ungefähr Version 3.1). |
email |
Ähnlich wie die Analysefunktion standard, versucht jedoch intensiver, eine E-Mail-Adresse als vollständiges Token abzugleichen. |
keyword |
Die Eingabe ist in keine Tokens zerlegt. |
simple |
Teilt den Text bei Nicht-Buchstaben. |
simple_asciifolding |
Teilt den Text bei Nicht-Buchstaben. Wandelt Zeichen in das nächste ASCII-Äquivalent um |
standard |
Die Standardanalysefunktion. Es implementiert die Worttrennungsregeln aus dem Unicode™-Algorithmus zur Textsegmentierung. |
whitespace |
Teilt den Text an den Grenzen des weißen Raums. |
Beispiel für ein Dokument mit Angabe der Analysefunktion ('analyzer'):
{
"_id": "_design/analyzer_example",
"indexes": {
"INDEX_NAME": {
"index": "function (doc) { ... }",
"analyzer": "$ANALYZER_NAME"
}
}
}
Sprachspezifische Analysefunktionen
Diese Analysatoren lassen gebräuchliche Wörter der jeweiligen Sprache außer Acht, und viele tun dies auch Präfixe und Suffixe entfernen. Der Name der Sprache ist gleichzeitig der Name der Analysefunktion.
arabicarmenianbasquebulgarianbraziliancatalancjk(Chinesisch, Japanisch, Koreanisch)chinese(smartcn)czechdanishdutchenglishfinnishfrenchgermangreekgalicianhindihungarianindonesianirishitalianjapanese(kuromoji)latviannorwegianpersianpolish(stempel)portugueseromanianrussianspanishswedishthaiturkish
Sprachspezifische Analysefunktionen sind für die angegebene Sprache optimiert. Es ist nicht möglich, eine generische Analysefunktion mit einer sprachspezifischen Analysefunktion zu kombinieren. Stattdessen können Sie eine perfield Analysefunktion verwenden, um verschiedene Analysefunktionen für unterschiedliche Felder in den Dokumenten auszuwählen.
Feldspezifische Analysefunktionen
Durch die feldspezifische Analysefunktion (perfield) können viele Analysefunktionen für verschiedene Felder konfiguriert werden.
Beispiel für die Definition verschiedener Analysefunktionen für verschiedene Felder:
{
"_id": "_design/analyzer_example",
"indexes": {
"INDEX_NAME": {
"analyzer": {
"name": "perfield",
"default": "english",
"fields": {
"spanish": "spanish",
"german": "german"
}
},
"index": "function (doc) { ... }"
}
}
}
Stoppwörter
Stoppwörter sind Wörter, die nicht indexiert werden. Sie definieren diese Wörter in einem Entwurfsdokument, indem Sie die Zeichenfolge für die Analysefunktion in ein Objekt verwandeln.
Die Analysefunktionen keyword, simple und whitespace unterstützen keine Stoppwörter.
Die folgende Liste zeigt die Standardstoppwörter für die Analysefunktion standard:
"a", "an", "and", "are", "as", "at", "be", "but", "by", "for", "if",
"in", "into", "is", "it", "no", "not", "of", "on", "or", "such",
"that", "the", "their", "then", "there", "these", "they", "this",
"to", "was", "will", "with"
Sehen Sie sich das folgende Beispiel an, in dem nicht indizierte Wörter („Stoppwörter“) definiert werden:
{
"_id": "_design/stop_words_example",
"indexes": {
"INDEX_NAME": {
"analyzer": {
"name": "portuguese",
"stopwords": [
"foo",
"bar",
"baz"
]
},
"index": "function (doc) { ... }"
}
}
}
Tokenzerlegung der Analysefunktion testen
Sie können die Ergebnisse der Zerlegung in Tokens durch die Analysefunktion testen, indem Sie Beispieldaten durch eine POST-Anforderung an den Endpunkt _search_analyze übergeben.
Beispiel für die Verwendung von HTTP zum Testen der Analysefunktion keyword:
Host: $ACCOUNT.cloudant.com
POST /_search_analyze HTTP/1.1
Content-Type: application/json
{"analyzer":"keyword", "text":"ablanks@renovations.com"}
Beispiel für die Verwendung der Befehlszeile zum Testen der Analysefunktion keyword:
curl "https://$ACCOUNT.cloudant.com/_search_analyze" \
-H "Content-Type: application/json" \
-d '{"analyzer":"keyword", "text":"ablanks@renovations.com"}'
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.PostSearchAnalyzeOptions;
import com.ibm.cloud.cloudant.v1.model.SearchAnalyzeResult;
Cloudant service = Cloudant.newInstance();
PostSearchAnalyzeOptions searchAnalyzerOptions =
new PostSearchAnalyzeOptions.Builder()
.analyzer("keyword")
.text("ablanks@renovations.com")
.build();
SearchAnalyzeResult response =
service.postSearchAnalyze(searchAnalyzerOptions).execute()
.getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
service.postSearchAnalyze({
analyzer: 'keyword',
text: 'ablanks@renovations.com',
}).then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.post_search_analyze(
analyzer='keyword',
text='ablanks@renovations.com'
).get_result()
print(response)
postSearchAnalyzeOptions := service.NewPostSearchAnalyzeOptions(
"keyword",
"ablanks@renovations.com",
)
searchAnalyzeResult, _, err := service.PostSearchAnalyze(postSearchAnalyzeOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(searchAnalyzeResult, "", " ")
fmt.Println(string(b))
Das vorherige Go-Beispiel erfordert den folgenden Importblock:
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Ergebnis für den Test der Analysefunktion keyword:
{
"tokens": [
"ablanks@renovations.com"
]
}
Beispiel für die Verwendung von HTTP zum Testen der Analysefunktion standard:
Host: $ACCOUNT.cloudant.com
POST /_search_analyze HTTP/1.1
Content-Type: application/json
{"analyzer":"standard", "text":"ablanks@renovations.com"}
Beispiel für die Verwendung der Befehlszeile zum Testen der Analysefunktion standard:
curl "https://$ACCOUNT.cloudant.com/_search_analyze" -H "Content-Type: application/json"
-d '{"analyzer":"standard", "text":"ablanks@renovations.com"}'
Ergebnis für den Test der Analysefunktion standard:
{
"tokens": [
"ablanks",
"renovations.com"
]
}
Abfragen
Wenn Sie einen Suchindex erstellt haben, können Sie ihn abfragen.
-
Führen Sie eine Partitionsabfrage mit der folgenden Anforderung aus:
GET /$DATABASE/_partition/$PARTITION_KEY/_design/$DDOC/_search/$INDEX_NAME -
Führen Sie eine globale Abfrage mit der folgenden Anforderung aus:
GET /$DATABASE/_design/$DDOC/_search/$INDEX_NAME
Geben Sie Ihre Suche mithilfe des Parameters query an.
Beispiel für die Verwendung von HTTP zum Abfragen eines partitionierten Index:
GET /$DATABASE/_partition/$PARTITION_KEY/_design/$DDOC/_search/$INDEX_NAME?include_docs=true&query="*:*"&limit=1 HTTP/1.1
Content-Type: application/json
Host: $ACCOUNT.cloudant.com
Beispiel zur Abfrage eines partitionierten Index über die Befehlszeile:
curl "https://$ACCOUNT.cloudant.com/$DATABASE/_partition/$PARTITION_KEY/_design/$DDOC/_search/$INDEX_NAME?include_docs=true&query=\"*:*\"&limit=1"
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.PostPartitionSearchOptions;
import com.ibm.cloud.cloudant.v1.model.SearchResult;
Cloudant service = Cloudant.newInstance();
PostPartitionSearchOptions searchOptions =
new PostPartitionSearchOptions.Builder()
.db("<db-name>")
.partitionKey("<partition-key>")
.ddoc("<ddoc>")
.index("<index-name>")
.query("*:*")
.includeDocs(true)
.limit(1)
.build();
SearchResult response =
service.postPartitionSearch(searchOptions).execute()
.getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
service.postSearch({
db: '<db-name>',
partitionKey: '<partition-key>',
ddoc: '<ddoc>',
index: '<index-name>',
query: '*:*',
includeDocs: true,
limit: 1
}).then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.post_search(
db='<db-name>',
partition_key='<partition-key>',
ddoc='<ddoc>',
index='<index-name>',
query='*:*',
include_docs=True,
limit=1
).get_result()
print(response)
postPartitionSearchOptions := service.NewPostPartitionSearchOptions(
"<db-name>",
"<partition-key>",
"<ddoc>",
"<index-name>",
"*:*",
)
postPartitionSearchOptions.SetIncludeDocs(true)
postPartitionSearchOptions.SetLimit(1)
searchResult, _, err := service.PostPartitionSearch(postPartitionSearchOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(searchResult, "", " ")
fmt.Println(string(b))
Das vorherige Go-Beispiel erfordert den folgenden Importblock:
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Beispiel für die Verwendung von HTTP zum Abfragen eines globalen Index:
GET /$DATABASE/_design/$DDOC/_search/$INDEX_NAME?include_docs=true&query="*:*"&limit=1 HTTP/1.1
Content-Type: application/json
Host: $ACCOUNT.cloudant.com
Beispiel zur Abfrage eines globalen Index über die Befehlszeile:
curl "https://$ACCOUNT.cloudant.com/$DATABASE/_design/$DDOC/_search/$INDEX_NAME?include_docs=true&query=\"*:*\"&limit=1"
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.PostSearchOptions;
import com.ibm.cloud.cloudant.v1.model.SearchResult;
Cloudant service = Cloudant.newInstance();
PostSearchOptions searchOptions = new PostSearchOptions.Builder()
.db("<db-name>")
.ddoc("<ddoc>")
.index("<index-name>")
.query("*:*")
.includeDocs(true)
.limit(1)
.build();
SearchResult response =
service.postSearch(searchOptions).execute()
.getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
service.postSearch({
db: '<db-name>',
ddoc: '<ddoc>',
index: '<index-name>',
query: '*:*',
includeDocs: true,
limit: 1
}).then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.post_search(
db='<db-name>',
ddoc='<ddoc>',
index='<index-name>',
query='*:*',
include_docs=True,
limit=1
).get_result()
print(response)
postSearchOptions := service.NewPostSearchOptions(
"<db-name>",
"<ddoc>",
"<index-name>",
"*:*",
)
postSearchOptions.SetIncludeDocs(true)
postSearchOptions.SetLimit(1)
searchResult, _, err := service.PostSearch(postSearchOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(searchResult, "", " ")
fmt.Println(string(b))
Das vorherige Go-Beispiel erfordert den folgenden Importblock:
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Abfrageparameter
Sie müssen die Facettierung aktivieren, bevor Sie die folgenden Parameter verwenden können: counts und drilldown.
| Argument | Beschreibung | Optionale | Typ | Unterstützte Werte | Partitionsabfrage |
|---|---|---|---|---|---|
bookmark |
Ein Lesezeichen, das aus einer früheren Suche empfangen wurde. Dieser Parameter ermöglicht das seitenweise Durchblättern der Ergebnisse. Wenn keine Ergebnisse nach dem Lesezeichen vorhanden sind, empfangen Sie eine Antwort mit einem leeren Zeilenarray und demselben Lesezeichen als Bestätigung für das Ende der Ergebnisliste. | yes |
Zeichenfolge | Ja | |
counts |
Dieses Feld definiert ein Array von Namen von Zeichenfolgefeldern, für die Anzahlen angefordert werden. Die Antwort enthält die Anzahlen für jeden eindeutigen Wert dieses Feldnamens in den Dokumenten, die der Suchabfrage entsprechen. Die Facettierung muss für die Funktion dieses Parameters aktiviert sein. | Ja | JSON | Ein JSON-Array mit Feldnamen. | Nein |
drilldown |
Dieses Feld kann mehrfach verwendet werden. Jede Verwendung definiert ein Paar aus Feldname und Wert. Die Suche ermittelt nur Dokumente, die den Wert enthalten, der in dem genannten Feld angegeben wurde. Dies unterscheidet sich von der
Verwendung von "fieldname:value" im Parameter q nur dadurch, das die Werte nicht analysiert werden. Die Facettierung muss für die Funktion dieses Parameters aktiviert sein. |
Nein | JSON | Ein JSON-Array mit zwei Elementen: Feldname und Wert. | Ja |
group_field |
Ein Feld, nach dem durch die Suche ermittelte Übereinstimmungen gruppiert werden sollen. | Ja | Zeichenfolge | Eine Zeichenfolge, die den Namen eines Zeichenfolgefelds enthält. Felder, die andere Datentypen wie z. B. Zahlen, Objekte oder Arrays enthalten, können nicht verwendet werden. | Nein |
group_limit |
Die maximale Gruppenanzahl. Dieses Feld kann nur verwendet werden, wenn group_field angegeben wird. |
Ja | Numerisch | Nein | |
group_sort |
Dieses Feld definiert die Reihenfolge der Gruppen in einer Suche, die den Parameter group_field verwendet. Die Standardsortierreihenfolge ist 'Relevanz'. |
Ja | JSON | Dieses Feld kann dieselben Werte wie das Sortierfeld haben, d. h., es werden Einzelfelder und Arrays von Feldern unterstützt. | Nein |
highlight_fields |
Gibt die Felder an, die hervorgehoben werden sollen. Wenn angegeben, enthält das Ergebnisobjekt ein Feld highlights mit einem Eintrag für jedes angegebene Feld. |
Ja | Array von Zeichenfolgen | Ja | |
highlight_pre_tag |
Eine Zeichenfolge, die vor dem hervorgehobenen Wort in der hervorgehobenen Ausgabe eingefügt wird. | Ja. Standardwert:<em> |
Zeichenfolge | Ja | |
highlight_post_tag |
Eine Zeichenfolge, die nach dem hervorgehobenen Wort in der hervorgehobenen Ausgabe eingefügt wird. | Ja. Standardwert:</em> |
Zeichenfolge | Ja | |
highlight_number |
Die Anzahl der Fragmente, die hervorgehoben zurückgegeben werden. Wenn der Suchbegriff die Fragmentgröße überschreitet, wird der gesamte Suchbegriff zurückgegeben. | Ja. Standardwert: 1 | Numerisch | Ja | |
highlight_size |
Zerlegt einen Feldinhalt in eine Anzahl Zeichen (so genannte Fragmente) und hebt Übereinstimmungen nur innerhalb der angegebenen Fragmente hervor. | Ja. Standardwert: 100 Zeichen | Numerisch | Ja | |
include_docs |
Schließt den vollständigen Inhalt der Dokumente in die Antwort ein. | Ja | Boolescher Wert | Ja | |
include_fields |
Ein JSON-Array mit Feldnamen, die in die Suchergebnisse eingeschlossen werden sollen. Alle Felder, die eingeschlossen werden, müssen mit der Option store:true indexiert werden. |
Ja. Standardwert: alle Felder. | Array von Zeichenfolgen | Ja | |
limit |
Begrenzt die Anzahl der zurückgegebenen Dokumente auf die angegebene Zahl. Für eine gruppierte Suche begrenzt dieser Parameter die Anzahl der Dokumente pro Gruppe. | Ja | Numerisch | Der Grenzwert kann eine positive Ganzzahl bis einschließlich 200 sein. | Ja |
q |
Abkürzung für query. Führt eine Lucene-Abfrage aus. |
Nein | Zeichenfolge oder Zahl | Ja | |
query |
Führt eine Lucene-Abfrage aus. | Nein | Zeichenfolge oder Zahl | Ja | |
ranges |
Dieses Feld definiert Bereiche für facettierte, numerische Suchfelder. Der Wert ist ein JSON-Objekt, in dem die Feldnamen facettierte, numerische Suchfelder sind und die Werte der Felder JSON-Objekte sind. Die Feldnamen der JSON-Objekte
sind Namen für Bereiche. Die Werte sind Zeichenfolgen, die den Bereich beschreiben. Beispiel: "[0 TO 10]". |
Ja | JSON | Der Wert muss ein Objekt mit Feldern sein, die wiederum Objekte als Werte haben. Diese Objekte müssen Zeichenfolgen mit Bereichen als Feldwerte enthalten. | Nein |
sort |
Gibt die Sortierreihenfolge der Ergebnisse an. In einer gruppierten Suche (bei Verwendung von group_field) gibt dieser Parameter die Sortierreihenfolge innerhalb einer Gruppe an. Die Standardsortierreihenfolge ist 'Relevanz'. |
Ja | JSON | Eine JSON-Zeichenfolge der Form "fieldname<type>" oder -fieldname<type> für absteigende Reihenfolge. Dabei ist fieldname der Name eines Zeichenfolge- oder Zahlenfelds und type ist entweder 'number', 'string' oder ein JSON-Array mit Zeichenfolgen. Der Teil type ist optional und hat den Standardwert number. Beispiele: "foo", "-foo", "bar<string>",
"-foo<number>" und ["-foo<number>","bar<string>"]. Zeichenfolgefelder, die für die Sortierung verwendet werden, dürfen keine analysierten Felder sein. Felder,
die für die Sortierung verwendet werden, müssen durch dieselbe Indexierungsfunktion indexiert worden sein, die auch für die Suchabfrage verwendet wird. |
Ja |
stale |
Wartet nicht auf den Abschluss der Indexerstellung, um Ergebnisse zurückzugeben. | Ja | Zeichenfolge | OK | Ja |
Kombinieren Sie nicht die Optionen bookmark und stale. Diese Optionen schränken die Auswahl von gemeinsam genutzten Replikaten ein, die für die Antwort verwendet werden können. Wenn diese Optionen zusammen verwendet
werden, können sie Probleme verursachen, wenn Sie versuchen, auf Replikate zuzugreifen, die langsam oder nicht verfügbar sind.
Die Verwendung des Abfragearguments include_docs=true kann Auswirkungen auf die Leistung haben.
Relevanz
Wenn mehr als ein Ergebnis zurückgegeben werden kann, können diese Ergebnisse sortiert werden. Standardmäßig wird die Sortierreihenfolge durch die 'Relevanz' bestimmt.
Die Relevanz wird anhand des Apache-Lucene-Scoring-Verfahrens gemessen Nehmen Sie zum Beispiel an, dass Sie eine einfache Datenbank nach dem Wort
example durchsuchen und zwei Dokumente das Wort enthalten. Wenn das Wort example in dem einen Dokument zehnmal und in dem anderen Dokument nur zweimal erwähnt wird, wird das erste Dokument als 'relevanter' eingestuft.
Wenn Sie keinen Parameter sort angeben, wird standardmäßig die Relevanz verwendet. Die Übereinstimmungen mit dem höchsten Scoring werden zuerst zurückgegeben.
Wenn Sie einen Parameter sort angeben, werden Übereinstimmungen in der angegebenen Reihenfolge zurückgegeben und die Relevanz ignoriert.
Wenn Sie den Parameter sort verwenden wollen und außerdem die Reihenfolge nach Relevanz für Ihre Suchergebnisse festlegen wollen, verwenden Sie die Sonderfelder -<score> oder <score> innerhalb
des Parameters sort.
Suchabfragen in POST-Anforderungen senden
Anstelle der HTTP-Methode GET können Sie auch die Methode POST verwenden. Der Hauptvorteil von Abfragen mit der Methode POST besteht darin, dass sie einen Anforderungshauptteil haben können, sodass Sie
die Anforderung in Form eines JSON-Objekts angeben können. Jeder Parameter in der vorherigen Tabelle entspricht einem Feld im JSON-Objekt des Anforderungshauptteils.
Beispiel für eine HTTP-Suchanforderung mit der Methode POST:
POST /db/_design/ddoc/_search/searchname HTTP/1.1
Content-Type: application/json
Host: $ACCOUNT.cloudant.com
Beispiel für eine Suchanforderung mit der Methode POST über die Befehlszeile:
curl "https://$ACCOUNT.cloudant.com/$DATABASE/_design/$DDOC/_search/$INDEX_NAME" -X POST -H "Content-Type: application/json" -d @search.json
Beispiel für ein JSON-Dokument, das eine Suchanforderung enthält:
{
"q": "index:my query",
"sort": "foo",
"limit": 3
}
Seitenaufteilung
Verwenden Sie die Paginierung von Lesezeichen für Suchanfragen. Spezifische Details und Beispiele finden Sie in der API-Dokumentation zum Thema Paging bei Suchindexabfragen.
Abfragesyntax
Die Syntax für Suchanfragen bei „ IBM Cloudant “ basiert auf der
Lucene-Syntax. Suchabfragen haben die Form name:value, sofern
der Name nicht weggelassen wird. Wenn der Name weggelassen wird, wird das Standardfeld verwendet, wie in den folgenden Beispielen gezeigt.
Beispiele für Suchabfrageausdrücke:
// Birds
class:bird
// Animals that begin with the letter "l"
l*
// Carnivorous birds
class:bird AND diet:carnivore
// Herbivores that start with letter "l"
l* AND diet:herbivore
// Medium-sized herbivores
min_length:[1 TO 3] AND diet:herbivore
// Herbivores that are 2m long or less
diet:herbivore AND min_length:[-Infinity TO 2]
// Mammals that are at least 1.5m long
class:mammal AND min_length:[1.5 TO Infinity]
// Find "Meles meles"
latin_name:"Meles meles"
// Mammals who are herbivore or carnivore
diet:(herbivore OR omnivore) AND class:mammal
// Return all results
*:*
Abfragen über mehrere Felder können logisch kombiniert werden und Gruppen und Felder können noch weiter gruppiert werden. Die folgenden verfügbaren logischen Operatoren sind von der Groß-/Kleinschreibung abhängig: AND, +,
OR, NOT und -. Bereichsabfragen können auf Zeichenfolgen oder Zahlen ausgeführt werden.
Wenn Sie eine Suche nach grober Übereinstimmung durchführen wollen, können Sie eine Abfrage mit ~ ausführen, um Begriffe zu finden, die dem Suchbegriff ähnlich sind. Zum Beispiel,
look~ ergibt die Terme „ book “ und „ took “.
Wenn die Ober- und die Untergrenze einer Bereichsabfrage beides Zeichenfolgen sind, die nur numerische Ziffern enthalten, werden die Begrenzungen als Zahlen und nicht als Zeichenfolgen behandelt. Beispiel: Wenn Sie eine Suche mit der Abfrage
mod_date:["20170101" TO "20171231"] durchführen, enthalten die Ergebnisse Dokumente, für die mod_date zwischen den numerischen Werten 20170101 und 20171231 liegt und nicht zwischen den Zeichenfolgen
"20170101" und "20171231".
Sie können die Wichtigkeit eines Suchbegriffs ändern, indem Sie das Zeichen ^ und eine positive Zahl hinzufügen. Diese Änderung erzeugt Übereinstimmungen, die den Begriff proportional zum Einfluss des Boostwerts mit höherer oder
niedriger Relevanz enthalten. Der Standardwert ist 1 und hat keinen Einfluss auf die Erhöhung oder Verringerung der Übereinstimmungsstärke. Ein Dezimalwert von 0 - 1 verringert die Wichtigkeit, und senkt die Übereinstimmungsstärke. Ein Wert
größer 1 erhöht die Wichtigkeit und hebt die Übereinstimmungsstärke.
Platzhaltersuchen werden unterstützt, und zwar für Suchen nach Einzelzeichen (?) und Suchen nach mehreren Zeichen (*). Beispiel:
dat? würde mit date und data übereinstimmen, und dat* würde mit date,data,database sowie dates übereinstimmen. Platzhalter müssen nach
dem Suchbegriff angegeben werden.
Geben Sie *:* an, um alle Ergebnisse zurückzugeben.
Ergebnismengen aus Suchen sind auf 200 Zeilen begrenzt. Standardmäßig werden 25 Zeilen zurückgegeben. Die Anzahl der Zeilen, die zurückgegeben werden, kann über den Parameter limit geändert
werden.
Wenn in der Suchabfrage kein Argument "group_field" angegeben wird, enthält die Antwort ein Lesezeichen ('bookmark'). Wenn dieses Lesezeichen später in einem URL-Parameter angegeben wird, überspringt die Antwort die Zeilen,
die bereits angezeigt wurden, sodass der nächste Satz von Ergebnissen schnell und einfach abgerufen werden kann.
Die Antwort enthält nie ein Lesezeichen, wenn der Parameter "group_field" in der Suchabfrage angegeben wird.
Die Optionen group_field, group_limit und group_sort sind nur verfügbar, wenn Sie globale Abfragen durchführen.
Die folgenden Zeichen müssen mit Escapezeichen versehen werden, wenn nach ihnen gesucht werden soll:
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /
Stellen Sie einem dieser Zeichen jeweils ein Backslash-Zeichen () als Escapezeichen voran.(\).
Die Antwort auf eine Suchabfrage enthält ein Feld order für jedes der Ergebnisse. Das Feld order ist ein Array, in dem das erste Element das Feld bzw. die Felder sind, die im Parameter sort angegeben wurden.
Wenn in der Abfrage kein Parameter „ sort “ enthalten ist, enthält das Feld „ order “ den Lucene-Relevanzwert.
Wenn Sie die Funktion "Nach Entfernung sortieren" (sort by distance) wie im Abschnitt Geographische Suchen erläutert verwenden, ist das erste Element die Entfernung von einem Punkt.
Die Entfernung wird in Kilometern oder Meilen gemessen.
Das zweite Element im Array 'order' kann ignoriert werden. Es dient lediglich zu Fehlerbehebungszwecken.
Facettierung
IBM Cloudant Search unterstützt darüber hinaus eine Suche mit Facettierung, die eine schnelle und einfache Erkennung von zusammengefassten Informationen zu Übereinstimmungen ermöglicht. Sie können alle Dokumente mithilfe der speziellen Abfragesyntax
?q=*:* abgleichen und die zurückgegebenen Facetten zur Präzisierung Ihrer Abfrage verwenden. Um anzugeben, dass ein Feld für facettierte Abfragen indexiert werden muss, geben Sie {"facet": true} in den Optionen
der Abfrage an.
Beispiel für eine Suchabfrage, in der die facettierte Suche aktiviert wird:
function(doc) {
index("type", doc.type, {"facet": true});
index("price", doc.price, {"facet": true});
}
Für die Verwendung von Facetten müssen alle Dokumente im Index alle Felder enthalten, für die die Facettierung aktiviert wird. Wenn Ihre Dokumente nicht alle Felder enthalten, empfangen Sie einen Fehler bad_request mit der folgenden
Ursache: "Das Feld field_name ist nicht vorhanden." Wenn nicht jedes Dokument alle Felder für Facetten enthält, erstellen Sie für jedes Feld separate Indizes. Wenn Sie nicht separate Indizes für jedes Feld erstellen,
müssen Sie nur Dokumente einschließen, die alle Felder enthalten. Stellen Sie durch eine einzelne Anweisung if sicher, dass die Felder in jedem Dokument vorhanden sind.
Beispiel für eine Anweisung if, die prüft, ob die erforderlichen Felder in jedem Dokument vorhanden sind:
if (typeof doc.town == "string" && typeof doc.name == "string") {
index("town", doc.town, {facet: true});
index("name", doc.name, {facet: true});
}
Option 'counts'
Die Option counts ist nur verfügbar, wenn Sie globale Abfragen ausführen.
Die Facettensyntax für counts akzeptiert eine Liste von Feldern und gibt die Anzahl der Abfrageergebnisse für jeden eindeutigen Wert jedes benannten Feldes zurück.
Die Operation count funktioniert nur, wenn die indexierten Werte Zeichenfolgen sind. Die indexierten Werte können keine gemischten Typen haben. Wenn zum Beispiel 100 Zeichenfolgen und eine Zahl indexiert werden, kann der Index
nicht für Operationen count verwendet werden. Sie können den Typ mit dem Operator typeof prüfen und mit den Funktionen parseInt, parseFloat oder .toString() konvertieren.
Beispiel für eine Abfrage, in der die Facettensyntax counts verwendet wird:
?q=*:*&counts=["type"]
Beispiel für eine Antwort nach Verwendung der Facettensyntax counts:
{
"total_rows":100000,
"bookmark":"g...",
"rows":[...],
"counts":{
"type":{
"sofa": 10,
"chair": 100,
"lamp": 97
}
}
}
drilldown
Die Option drilldown ist nur verfügbar, wenn Sie globale Abfragen ausführen.
Sie können Ergebnisse auf Dokumente mit einer Dimension einschränken, die der angegebenen Bezeichnung ('label') entspricht. Schränken Sie die Ergebnisse ein, indem Sie einer Suchabfrage den Parameter drilldown=["dimension","label"] hinzufügen. Sie können mehrere Parameter drilldown angeben, um Ergebnisse in mehreren Dimensionen einzuschränken.
Die Verwendung des Parameters drilldown ist der Verwendung von key:value im Parameter q ähnlich, jedoch gibt der Parameter drilldown Werte zurück, die von der Analysefunktion möglicherweise
übergangen werden.
Wenn die Analysefunktion zum Beispiel ein Stoppwort wie "a" nicht indexiert hat, gibt der Parameter drilldown es zurück, wenn Sie drilldown=["key","a"] angeben.
Option 'ranges'
Die Option ranges ist nur verfügbar, wenn Sie globale Abfragen ausführen.
Die Facettensyntax range verwendet wiederum die Lucene-Syntax für Bereiche, um Anzahlen von Ergebnissen zurückzugeben, die in jede angegebene Kategorie passen. Abfragen mit einschließenden Bereichen werden durch eckige Klammern
([, ]) angegeben. Abfragen mit ausschließenden Bereichen werden durch geschweifte Klammern ({, }) angegeben.
Die indexierten Werte können keine gemischten Typen haben. Wenn zum Beispiel 100 Zeichenfolgen und eine Zahl indexiert werden, kann der Index nicht für Operationen range verwendet werden. Sie können den Typ mit dem Operator typeof prüfen und mit den Funktionen parseInt, parseFloat oder .toString() konvertieren.
Beispiel für eine Anforderung, die eine Facettensuche für übereinstimmende Bereiche (ranges) verwendet:
?q=*:*&ranges={"price":{"cheap":"[0 TO 100]","expensive":"{100 TO Infinity}"}}
Beispiel für Ergebnisse nach einer Prüfung von Bereichen (ranges) für eine Facettensuche:
{
"total_rows":100000,
"bookmark":"g...",
"rows":[...],
"ranges": {
"price": {
"expensive": 278682,
"cheap": 257023
}
}
}
Geografische Suchen
Neben dem Suchen nach den Inhalten von Textfeldern können Sie Ihre Ergebnisse auch nach Entfernung von einem geografischen Punkt (Koordinaten) sortieren.
Zum Sortieren von Ergebnissen auf diese Weise müssen Sie zwei numerische Felder indexieren, die den Längengrad und den Breitengrad darstellen.
Sie können anschließend eine Abfrage unter Verwendung des besonderen Sortierfelds <distance...> ausführen, das fünf Parameter erfordert:
- Name des Längengradfelds - Der Name Ihres Längengradfelds (Beispiel:
mylon). - Name des Breitengradfelds - Der Name Ihres Breitengradfelds (Beispiel:
mylat). - Längengrad des Ursprungs - Der Längengrad des Ortes, von dem aus nach Entfernung sortiert werden soll.
- Breitengrad des Ursprungs - Der Breitengrad des Ortes, von dem aus nach Entfernung sortiert werden soll.
- Einheiten - Die einzuschließenden Einheiten:
kmfür Kilometer odermifür Meilen. Die Entfernung wird im Feld 'order' zurückgegeben.
Sie können die Sortierung nach Entfernung mit jeder anderen Suchanfrage kombinieren, beispielsweise mit Bereichssuchen nach Breiten- und Längengrad oder mit Suchanfragen, die nicht-geografische Informationen beinhalten.
Auf diese Weise können Sie in einer Manipulationsbox (Bounding Box) suchen und die Suche durch zusätzliche Kriterien eingrenzen.
Beispiel für geografische Daten:
{
"name":"Aberdeen, Scotland",
"lat":57.15,
"lon":-2.15,
"type":"city"
}
Beispiel für ein Entwurfsdokument, das einen Suchindex für die geografischen Daten enthält:
function(doc) {
if (doc.type && doc.type == 'city') {
index('city', doc.name, {'store': true});
index('lat', doc.lat, {'store': true});
index('lon', doc.lon, {'store': true});
}
}
Beispiel für die Verwendung von HTTP, um eine Abfrage auszuführen, die Städte in der nördlichen Hemisphäre nach Entfernung von New York sortiert:
GET /examples/_design/cities-designdoc/_search/cities?q=lat:[0+TO+90]&sort="<distance,lon,lat,-74.0059,40.7127,km>" HTTP/1.1
Host: $ACCOUNT.cloudant.com
Beispiel für die Verwendung der Befehlszeile, um eine Abfrage auszuführen, die Städte in der nördlichen Hemisphäre nach Entfernung von New York sortiert:
curl "https://$ACCOUNT.cloudant.com/examples/_design/cities-designdoc/_search/cities?q=lat:\[0+TO+90\]&sort=\"<distance,lon,lat,-74.0059,40.7127,km>\""
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.PostSearchOptions;
import com.ibm.cloud.cloudant.v1.model.SearchResult;
import java.util.Arrays;
Cloudant service = Cloudant.newInstance();
PostSearchOptions searchOptions = new PostSearchOptions.Builder()
.db("examples")
.ddoc("cities-designdoc")
.index("cities")
.query("lat:\\[0+TO+90\\]")
.sort(Arrays.asList("<distance,lon,lat,-74.0059,40.7127,km>"))
.build();
SearchResult response =
service.postSearch(searchOptions).execute()
.getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
service.postSearch({
db: 'examples',
ddoc: 'cities-designdoc',
index: 'cities',
query: 'lat:\\[0+TO+90\\]',
sort: ['<distance,lon,lat,-74.0059,40.7127,km>']
}).then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.post_search(
db='examples',
ddoc='cities-designdoc',
index='cities',
query='lat:\\[0+TO+90\\]',
sort=['<distance,lon,lat,-74.0059,40.7127,km>']
).get_result()
print(response)
postSearchOptions := service.NewPostSearchOptions(
"examples",
"cities-designdoc",
"cities",
"lat:\\[0+TO+90\\]",
)
postSearchOptions.SetSort([]string{"<distance,lon,lat,-74.0059,40.7127,km>"})
searchResult, _, err := service.PostSearch(postSearchOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(searchResult, "", " ")
fmt.Println(string(b))
Das vorherige Go-Beispiel erfordert den folgenden Importblock:
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Die folgende (gekürzte) Beispielantwort enthält eine Liste mit Städten der nördlichen Hemisphäre, die nach Entfernung zu New York sortiert sind:
{
"total_rows": 205,
"bookmark": "g1A...XIU",
"rows": [
{
"id": "city180",
"order": [
8.530665755719783,
18
],
"fields": {
"city": "New York, N.Y.",
"lat": 40.78333333333333,
"lon": -73.96666666666667
}
},
{
"id": "city177",
"order": [
13.756343205985946,
17
],
"fields": {
"city": "Newark, N.J.",
"lat": 40.733333333333334,
"lon": -74.16666666666667
}
},
{
"id": "city178",
"order": [
113.53603438866077,
26
],
"fields": {
"city": "New Haven, Conn.",
"lat": 41.31666666666667,
"lon": -72.91666666666667
}
}
]
}
Suchbegriffe hervorheben
Manchmal ist es nützlich, den Kontext abzurufen, in dem ein Suchbegriff erwähnt wurde, sodass Benutzern Ergebnisse mit hervorgehobenen Suchbegriffen angezeigt werden können.
Zum Abrufen von Ergebnisse mit Hervorhebungen fügen Sie der Suchabfrage den Parameter highlight_fields hinzu. Geben Sie die Feldnamen an, für die Sie Auszüge zurückgeben wollen, in denen der Suchbegriff hervorgehoben wird.
Ein Suchbegriff wird standardmäßig in <em>-Tags gesetzt, um ihn hervorzuheben, jedoch kann die Hervorhebung mit den Parametern highlights_pre_tag und highlights_post_tag überschrieben werden.
Die Länge der Fragmente beträgt standardmäßig 100 Zeichen. Mithilfe des Parameters highlights_size kann eine andere Länge angefordert werden.
Der Parameter highlights_number steuert die Anzahl der Fragmente, die zurückgegeben werden. Der Standardwert ist 1.
In der Antwort wird ein Feld highlights hinzugefügt, das je ein Unterfeld pro Feldname enthält.
Für jedes Feld empfangen Sie ein Array von Fragmenten, in denen der Suchbegriff hervorgehoben ist.
Damit die Hervorhebung funktioniert, müssen Sie das Feld im Index mit der Option store: true speichern.
Beispiel für die Verwendung von HTTP, um eine Suche mit aktivierter Hervorhebung durchzuführen:
GET /movies/_design/searches/_search/movies?q=movie_name:Azazel&highlight_fields=["movie_name"]&highlight_pre_tag=" "&highlight_post_tag=" "&highlights_size=30&highlights_number=2 HTTP/1.1
HOST: $ACCOUNT.cloudant.com
Authorization: ...
Im folgenden Beispiel sehen Sie die Befehlszeile für die Suche mit aktivierter Hervorhebung:
curl "https://$ACCOUNT.cloudant.com/movies/_design/searches/_search/movies?q=\"movie_name:Azazel\"&highlight_fields=\[\"movie_name\"\]&highlight_pre_tag=\" \"&highlight_post_tag=\" \"&highlights_size=30&highlights_number=2" \
-X GET
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.PostSearchOptions;
import com.ibm.cloud.cloudant.v1.model.SearchResult;
import java.util.Arrays;
Cloudant service = Cloudant.newInstance();
PostSearchOptions searchOptions = new PostSearchOptions.Builder()
.db("movies")
.ddoc("searches")
.index("movies")
.query("movie_name:Azazel")
.highlightFields(Arrays.asList("[\"movie_name\"]"))
.highlightPreTag("\" \"")
.highlightPostTag("\" \"")
.highlightSize(30)
.highlightNumber(2)
.build();
SearchResult response =
service.postSearch(searchOptions).execute()
.getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
service.postSearch({
db: 'movies',
ddoc: 'searches',
index: 'movies',
query: 'movie_name:Azazel',
highlightFields: ['["movie_name"]'],
highlightPreTag: '" "',
highlightPostTag: '" "',
highlightSize: 30,
highlightNumber: 2
}).then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.post_search(
db='movies',
ddoc='searches',
index='movies',
query='movie_name:Azazel',
highlight_fields=['["movie_name"]'],
highlight_pre_tag='" "',
highlight_post_tag='" "',
highlight_size=30,
highlight_number=2
).get_result()
print(response)
postSearchOptions := service.NewPostSearchOptions(
"movies",
"searches",
"movies",
"movie_name:Azazel",
)
postSearchOptions.SetHighlightFields([]string{"[\"movie_name\"]"})
postSearchOptions.SetHighlightPreTag("\" \"")
postSearchOptions.SetHighlightPostTag("\" \"")
postSearchOptions.SetHighlightSize(30)
postSearchOptions.SetHighlightNumber(2)
searchResult, _, err := service.PostSearch(postSearchOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(searchResult, "", " ")
fmt.Println(string(b))
Das vorherige Go-Beispiel erfordert den folgenden Importblock:
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Beispiel für die Ergebnisse einer Suche mit Hervorhebungen:
{
"highlights": {
"movie_name": [
" on the Azazel Orient Express",
" Azazel manuals, you"
]
}
}
Metadaten für Suchindizes
Zum Abrufen von Informationen zu einem Suchindex senden Sie eine GET-Anforderung an den Endpunkt _search_info, wie im folgenden Beispiel gezeigt.
DDOC verweist auf das Entwurfsdokument, das den Index enthält, und INDEX_NAME ist der Name des Index.
Beispiel für die Verwendung von HTTP, um Metadaten für einen Suchindex anzufordern:
GET /$DATABASE/_design/$DDOC/_search_info/$INDEX_NAME HTTP/1.1
Beispiel für die Verwendung der Befehlszeile, um Metadaten für einen Suchindex anzufordern:
curl "https://$ACCOUNT.cloudant.com/$DATABASE/_design/$DDOC/_search_info/$INDEX_NAME" \
-X GET
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.GetSearchInfoOptions;
import com.ibm.cloud.cloudant.v1.model.SearchInfoResult;
Cloudant service = Cloudant.newInstance();
GetSearchInfoOptions infoOptions =
new GetSearchInfoOptions.Builder()
.db("<db-name>")
.ddoc("<ddoc>")
.index("<index-name>")
.build();
SearchInfoResult response =
service.getSearchInfo(infoOptions).execute()
.getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
service.getSearchInfo({
db: '<db-name>',
ddoc: '<ddoc>',
index: '<index-name>'
}).then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.get_search_info(
db='<db-name>',
ddoc='<ddoc>',
index='<index-name>'
).get_result()
print(response)
getSearchInfoOptions := service.NewGetSearchInfoOptions(
"<db-name>",
"<ddoc>",
"<index-name>",
)
searchInfoResult, _, err := service.GetSearchInfo(getSearchInfoOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(searchInfoResult, "", " ")
fmt.Println(string(b))
Das vorherige Go-Beispiel erfordert den folgenden Importblock:
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Die Antwort enthält Informationen zu Ihrem Index, wie zum Beispiel die Anzahl der Dokumente in dem Index und die Größe des Index auf Platte.
Beispielantwort nach einer Anforderung von Metadaten für einen Suchindex:
{
"name": "_design/DDOC/INDEX",
"search_index": {
"pending_seq": 7125496,
"doc_del_count": 129180,
"doc_count": 1066173,
"disk_size": 728305827,
"committed_seq": 7125496
}
}