Utilisation de la recherche IBM Cloudant
IBM® Cloudant® for IBM Cloud® La recherche permet d'effectuer des requêtes linguistiques en texte libre, multi-champs et géospatiales simples à l'aide de Apache Lucene, un moteur de recherche open-source.
IBM Cloudant La recherche est utilisée pour créer des requêtes flexibles utilisant un, plusieurs ou tous les champs indexés à l'aide de la syntaxe de requête de Lucene Apache.
Comment fonctionne la recherche sur IBM Cloudant
Les définitions de l'index de recherche sont stockées dans les documents de conception sous la forme d'une fonction JavaScript qui est exécutée pour chaque document de la base de données. La fonction définit les attributs qui sont indexés, ceux qui sont stockés dans l'index mais ne sont pas consultables et la manière dont chaque attribut de texte est prétraité avant l'indexation (à l'aide d'un "analyseur" de recherche choisi).
IBM Cloudant les recherches peuvent porter sur l'ensemble de la base de données ou, dans le cas des bases de données partitionnées, sur une seule partition où options.partitioned est true dans le document de conception.
Quand utiliser la recherche IBM Cloudant
IBM Cloudant La recherche est idéale pour :
- Recherche plein texte tenant compte de la langue, recherche par caractères génériques et requêtes simples sur des champs numériques ou textuels.
- Requêtes flexibles sur un ensemble de champs indexés.
- Requêtes géospatiales simples telles que trouver le plus proche ou trouver avec une boîte de délimitation.
- Agrégations de comptage sur des champs individuels dans l'ensemble de résultats - connues sous le nom de "facettes".
Quand ne pas utiliser la recherche IBM Cloudant
Éviter IBM Cloudant Rechercher
- Agrégation (autre que par facettes). Utilisez plutôt Views.
Construire un index de recherche
Pour créer un index de recherche, ajoutez une fonction JavaScript à un document de conception se trouvant dans la base de données. Un index est généré une fois qu'il a traité une demande de recherche ou une fois que le serveur a détecté une
mise à jour de document. La fonction index admet les paramètres suivants :
- Nom de zone : nom de la zone à utiliser lorsque vous interrogez l'index. Si vous associez ce paramètre à la valeur
default, cette zone est interrogée si aucune zone n'est spécifiée dans la syntaxe de requête. - Données à indexer, par exemple
doc.address.country. - (Facultatif) Le troisième paramètre inclut les zones suivantes :
boost,facet,indexetstore. Celles-ci sont décrites plus en détail ultérieurement.
Par défaut, une réponse d'index de recherche renvoie 25 lignes. Vous pouvez changer le nombre de lignes qui est renvoyé avec le paramètre limit. Cependant, un résultat défini à partir d'une recherche sera limité à 200 lignes. Chaque
réponse inclut une zone bookmark. Vous pouvez inclure la valeur de la zone bookmark dans des requêtes ultérieures pour examiner les réponses.
Vous pouvez interroger l'API avec l'une des méthodes suivantes : URI, tableau de bord IBM Cloudant, curl ou plug-in de navigateur tel que Postman ou RESTClient.
Voici un exemple de document de conception qui définit un index de recherche :
{
"_id": "_design/search_example",
"indexes": {
"animals": {
"index": "function(doc){ ... }"
}
}
}
Type de partitionnement d'index de recherche
Un index de recherche hérite du type de partitionnement de Zone options.partitioned du document de conception qui le contient.
Fonctions d'index
Si vous tentez d'effectuer l'indexation en utilisant une zone de données qui n'existe pas, l'indexation échoue. Pour éviter ce problème, utilisez une clause de protection appropriée.
Vos fonctions d'indexation s'exécutent dans un environnement à contraintes de mémoire où le document lui-même fait partie de la mémoire utilisée dans cet environnement. La pile et le document de votre code doivent s'insérer dans cette mémoire. La taille des documents ne peut pas dépasser 64 Mo.
Dans un index de recherche, n'indexez pas le même nom de zone avec plusieurs types de données. Si le même nom de zone est indexé avec des types de données différents dans la même fonction d'index de recherche, une erreur peut survenir. Cette
erreur se produit lorsque vous interrogez l'index de recherche contenant le champ « was indexed without position data ». Par exemple, n'incluez pas les lignes ci-dessous dans la même fonction d'index de recherche. Ces lignes indexent
la zone myfield comme s'il s'agissait de deux types de données différents : sous forme de chaîne "this is a string" et sous forme de nombre 123.
index("myfield", "this is a string");
index("myfield", 123);
La fonction contenue dans la zone d'index est une fonction JavaScript appelée pour chaque document de la base de données. La fonction admet le document comme paramètre, en extrait des données, puis appelle la fonction qui est définie dans la
zone index pour indexer ces données.
La fonction index admet trois paramètres, où le troisième paramètre est facultatif.
Le premier paramètre correspond au nom du champ que vous comptez utiliser lors de l'interrogation de l'index, qui est spécifié dans la partie syntaxe Lucene des requêtes suivantes. Voici un exemple de requête contenant ce paramètre :
query=color:red
Le nom de zone Lucene color est le premier paramètre de la fonction index.
Le paramètre query peut être abrégé en q. Ainsi, vous pouvez également écrire la requête comme suit :
q=color:red
Si la valeur spéciale "default" est utilisée lorsque vous définissez le nom, il n'est pas nécessaire de spécifier un nom de zone au moment de la requête. Ainsi, la requête peut être simplifiée :
query=red
Le deuxième paramètre correspond aux données à indexer. Gardez à l'esprit les informations suivantes lorsque vous indexez vos données :
- Ces données doivent correspondre à une chaîne, un nombre ou une valeur booléenne. Les autres types renvoient une erreur depuis l'appel de fonction d'index.
- Si une erreur est renvoyée lorsque votre fonction s'exécute, pour cette raison ou pour toute autre raison, le document n'est pas ajouté à cet index de recherche.
Le troisième paramètre, qui est facultatif, est un objet JavaScript possédant les zones suivantes :
| Option | Description | Valeurs | Valeur par défaut |
|---|---|---|---|
boost |
Nombre spécifiant la pertinence dans les résultats de recherche. Un contenu indexé avec une valeur de pondération supérieure à 1 est plus pertinent qu'un contenu indexé sans valeur de pondération. Un contenu avec une valeur de pondération inférieure à 1 est moins pertinent. | Nombre en virgule flottante positif | 1 (pas de pondération) |
facet |
Crée un index de facettes. Pour plus d'informations, voir Création de facettes. | true |
false |
index |
Indique si les données sont indexées et si tel est le cas, comment. Si la valeur est false, les données ne peuvent pas être utilisées pour les recherches, mais peuvent tout de même être extraites de l'index si store a pour valeur true. Pour plus d'informations, voir Analyseurs. |
true, false |
true |
store |
Si la valeur est true, la valeur est renvoyée dans le résultat de la recherche ; sinon, elle n'est pas renvoyée. |
true, false |
false |
Si vous ne définissez pas le paramètre store, les résultats de données d'index pour le document ne sont pas renvoyés en réponse à une requête.
Voici un exemple de fonction d'index de recherche :
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});
}
}
Store ou include_docs=true
Lorsqu'IBM Cloudant renvoie des données à l'issue d'une recherche, les options que vous pouvez choisir sont store: true ou include_docs=true. Consultez les descriptions suivantes :
- Lors de l'indexation, choisissez l'option
{store: true}. Cette option indique que la zone que vous traitez doit être stockée dans l'index. Une zone peut être "stockée" même si elle n'est pas utilisée pour l'indexation proprement dite. Par exemple, vous pouvez choisir de "stocker" un numéro de téléphone, même si votre algorithme de recherche n'inclut pas la recherche par numéro de téléphone. - Lors de la requête, choisissez l'option
?include_docs=truepour indiquer à IBM Cloud que tout le corps de chaque document correspondant doit être renvoyé.
Dans le cas de la première option, vous disposez d'un index plus important, mais c'est le moyen le plus rapide d'extraire des données. Avec la seconde option, l'index conserve une taille minimale, mais IBM Cloud doit effectuer davantage de travail lors de la requête car il doit extraire les corps de document une fois que l'ensemble de résultats de la recherche a été calculé. L'exécution de ce processus peut être plus lente et ajouter une charge supplémentaire au cluster IBM Cloud.
Si possible, choisissez la première option en suivant les conseils suivants :
- Indexez uniquement les zones qui doivent être utilisées pour la recherche.
- Stockez uniquement les zones qui doivent être extraites lors de la requête.
Clauses de protection d'index
La fonction index requiert le nom de la zone de données à indexer comme deuxième paramètre. Cependant, si cette zone de données n'existe pas pour le document, une erreur survient. La solution consiste à utiliser une « clause de
sécurité » appropriée qui vérifie si le champ existe. Cette clause contient le type de données attendu en vue de la création de l'index correspondant.
Voici un exemple de définition qui ne contient pas de validation du type de zone de données d'index :
if (doc.min_length) {
index("min_length", doc.min_length, {"store": true});
}
Vous pouvez utiliser l'opérateur JavaScript typeof pour implémenter le test de clause de protection. Si la zone existe et présente le type attendu, le nom de type correct est renvoyé. Le test de la clause de protection réussit,
ce qui signifie que vous pouvez utiliser la fonction d'index en toute sécurité. Si la zone n'existe pas, vous n'obtenez pas le type de zone attendu et c'est pourquoi vous ne pouvez pas tenter l'indexation de la zone.
JavaScript considère qu'un résultat a pour valeur false si l'une des valeurs suivantes est testée :
- 'undefined'
- NULL
- Le chiffre +0
- Le chiffre -0
- NaN (not-a-number)
- "" (chaîne vide)
Voici un exemple utilisant une clause de protection pour vérifier si la zone de données requise existe et comporte un nombre avant toute tentative d'indexation :
if (typeof doc.min_length === 'number') {
index("min_length", doc.min_length, {"store": true});
}
Utilisez un test de clause de protection générique pour vous assurer que le type de la zone de données candidate est défini.
Voici un exemple de clause de protection "générique" :
if (typeof doc.min_length) !== 'undefined') {
// The field exists, and does have a type, so we can proceed to index using it.
...
}
Analyseurs
Les analyseurs sont des paramètres qui définissent la façon de reconnaître les termes dans le texte. Pour plus d'informations, voir Analyseurs de recherche.
Ils peuvent être utiles si vous avez besoin d'indexer plusieurs langues.
Le tableau suivant présente une liste d'analyseurs génériques pris en charge par la recherche IBM Cloudant
| Analyseur | Description |
|---|---|
classic |
Analyseur Lucene standard, version 3.1. |
email |
Identique à l'analyseur standard, mais essaye plus rigoureusement de faire correspondre une adresse électronique comme jeton complet. |
keyword |
L'entrée n'est pas tokenisée. |
simple |
Divise le texte au niveau des non-lettres. |
simple_asciifolding |
Divise le texte au niveau des non-lettres. Convertit les caractères en leur équivalent ASCII le plus proche |
standard |
Analyseur par défaut. Il met en œuvre les règles de césure de mots issues de l'algorithme de segmentation de texte Unicode™). |
whitespace |
Divise le texte aux limites de l'espace blanc. |
Voici un exemple de document d'analyseur :
{
"_id": "_design/analyzer_example",
"indexes": {
"INDEX_NAME": {
"index": "function (doc) { ... }",
"analyzer": "$ANALYZER_NAME"
}
}
}
Analyseurs propres à la langue
Ces analyseurs omettent les mots courants de la langue en question, et beaucoup d'entre eux « supprimer les préfixes et les suffixes » également. Le nom de la langue est également le nom de l'analyseur.
arabicarmenianbasquebulgarianbraziliancatalancjk(chinois, japonais, coréen)chinese(smartcn)czechdanishdutchenglishfinnishfrenchgermangreekgalicianhindihungarianindonesianirishitalianjapanese(kuromoji)latviannorwegianpersianpolish(stempel)portugueseromanianrussianspanishswedishthaiturkish
Les analyseurs propres à la langue sont optimisés pour la langue spécifiée. Vous ne pouvez pas combiner un analyseur générique avec un analyseur propre à la langue. A la place, vous pouvez utiliser un analyseur perfield afin de sélectionner des analyseurs différents pour diverses zones dans les documents.
Analyseurs par zone
L'analyseur perfield configure de nombreux analyseurs pour différentes zones.
Voici un exemple qui définit différents analyseurs pour diverses zones :
{
"_id": "_design/analyzer_example",
"indexes": {
"INDEX_NAME": {
"analyzer": {
"name": "perfield",
"default": "english",
"fields": {
"spanish": "spanish",
"german": "german"
}
},
"index": "function (doc) { ... }"
}
}
}
Mots vides
Les mots vides sont des mots qui ne sont pas indexés. Vous les définissez dans un document de conception en transformant la chaîne de l'analyseur en objet.
Les analyseurs keyword, simple et whitespace ne prennent pas en charge les mots vides.
Les mots vides par défaut de l'analyseur standard sont les suivants :
"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"
Voici un exemple illustrant la définition de mots non indexés (« stop »):
{
"_id": "_design/stop_words_example",
"indexes": {
"INDEX_NAME": {
"analyzer": {
"name": "portuguese",
"stopwords": [
"foo",
"bar",
"baz"
]
},
"index": "function (doc) { ... }"
}
}
}
Test du marquage sémantique de l'analyseur
Vous pouvez tester les résultats du marquage sémantique de l'analyseur en publiant des données d'échantillon sur le noeud final _search_analyze.
Voici un exemple qui utilise HTTP pour tester l'analyseur keyword :
Host: $ACCOUNT.cloudant.com
POST /_search_analyze HTTP/1.1
Content-Type: application/json
{"analyzer":"keyword", "text":"ablanks@renovations.com"}
Voici un exemple qui utilise la ligne de commande pour tester l'analyseur 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))
L'exemple précédent de Go requiert le bloc d'importation suivant :
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Voici le résultat d'un test de l'analyseur keyword :
{
"tokens": [
"ablanks@renovations.com"
]
}
Voici un exemple qui utilise HTTP pour tester l'analyseur standard :
Host: $ACCOUNT.cloudant.com
POST /_search_analyze HTTP/1.1
Content-Type: application/json
{"analyzer":"standard", "text":"ablanks@renovations.com"}
Voici un exemple qui utilise la ligne de commande pour tester l'analyseur standard :
curl "https://$ACCOUNT.cloudant.com/_search_analyze" -H "Content-Type: application/json"
-d '{"analyzer":"standard", "text":"ablanks@renovations.com"}'
Voici le résultat d'un test de l'analyseur standard :
{
"tokens": [
"ablanks",
"renovations.com"
]
}
Requêtes
Après avoir créé un index de recherche, vous pouvez l'interroger.
-
Exécutez une requête de partition avec la demande suivante :
GET /$DATABASE/_partition/$PARTITION_KEY/_design/$DDOC/_search/$INDEX_NAME -
Exécutez une requête globale avec la demande suivante :
GET /$DATABASE/_design/$DDOC/_search/$INDEX_NAME
Spécifiez votre recherche avec le paramètre query.
Voici un exemple qui utilise HTTP pour interroger un index partitionné :
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
Voici un exemple qui utilise la ligne de commande pour interroger un index partitionné :
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))
L'exemple précédent de Go requiert le bloc d'importation suivant :
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Voici un exemple qui utilise HTTP pour interroger un index global :
GET /$DATABASE/_design/$DDOC/_search/$INDEX_NAME?include_docs=true&query="*:*"&limit=1 HTTP/1.1
Content-Type: application/json
Host: $ACCOUNT.cloudant.com
Voici un exemple qui utilise la ligne de commande pour interroger un index global :
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))
L'exemple précédent de Go requiert le bloc d'importation suivant :
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Paramètres de requête
Vous devez activer la création de facettes pour pouvoir utiliser les paramètres suivants : counts et drilldown.
| Argument | Description | Facultatif | Type | Valeurs prises en charge | Requête de partition |
|---|---|---|---|---|---|
bookmark |
Signet reçu d'une recherche précédente. Ce paramètre permet la pagination des résultats. S'il n'existe pas de résultats après le signet, vous obtenez une réponse comportant un tableau de lignes vides et le même signet, qui confirme la fin de la liste de résultats. | yes |
Chaîne | Oui | |
counts |
Cette zone définit un tableau de noms de zones de chaîne, pour lesquels des nombres sont demandés. La réponse inclut des nombres pour chaque valeur unique de ce nom de zone parmi les documents correspondant à la requête de recherche. La création de facettes doit être activée pour que ce paramètre fonctionne. | Oui | JSON | Tableau JSON de noms de zone. | Non |
drilldown |
Cette zone peut être utilisée plusieurs fois. Chaque utilisation définit une paire nom de zone et valeur. La recherche correspond uniquement aux documents qui contiennent la valeur fournie dans la zone nommée. Elle diffère de l'utilisation
de "fieldname:value" dans le paramètre q uniquement car les valeurs ne sont pas analysées. La création de facettes doit être activée pour que ce paramètre fonctionne. |
Non | JSON | Tableau JSON incluant deux éléments : le nom de zone et la valeur. | Oui |
group_field |
Zone en fonction de laquelle regrouper les correspondances de recherche. | Oui | Chaîne | Chaîne incluant le nom d'une zone de chaîne. Les zones qui contiennent d'autres données, telles que des nombres, des objets ou des tableaux, ne peuvent pas être utilisées. | Non |
group_limit |
Nombre maximal de groupes. Cette zone ne peut être utilisée que si group_field est spécifié. |
Oui | Numérique | Non | |
group_sort |
Cette zone définit l'ordre des groupes dans une recherche qui utilise group_field. L'ordre de tri par défaut est la pertinence. |
Oui | JSON | Cette zone peut avoir les mêmes valeurs que la zone de tri ; ainsi, les zones uniques et les tableaux de zones sont pris en charge. | Non |
highlight_fields |
Spécifie les zones à mettre en évidence. Si cet argument est spécifié, l'objet de résultat inclut une zone highlights avec une entrée pour chaque zone spécifiée. |
Oui | Tableau de chaînes | Oui | |
highlight_pre_tag |
Chaîne insérée avant le mot mis en évidence dans la sortie highlights. | Oui, par défaut à <em> |
Chaîne | Oui | |
highlight_post_tag |
Chaîne insérée après le mot mis en évidence dans la sortie highlights. | Oui, par défaut à </em> |
Chaîne | Oui | |
highlight_number |
Nombre de fragments renvoyés dans la zone hightlights. Si la taille du terme de recherche est supérieure à la taille du fragment, il est renvoyé entièrement. | Oui, 1 par défaut | Numérique | Oui | |
highlight_size |
Segmente le contenu de zone en nombre de caractères, appelés fragments, et met en évidence les correspondances uniquement dans les fragments spécifiés. | Oui, 100 caractères par défaut | Numérique | Oui | |
include_docs |
Inclusion du contenu complet des documents dans la réponse. | Oui | Booléen | Oui | |
include_fields |
Tableau JSON de noms de zone à inclure dans les résultats de recherche. Toutes les zones incluses doivent être indexées avec l'option store:true. |
Oui, toutes les zones par défaut | Tableau de chaînes | Oui | |
limit |
Limite le nombre de documents renvoyés au nombre spécifié. Pour une recherche groupée, ce paramètre limite le nombre de documents par groupe. | Oui | Numérique | La valeur de limite peut être un nombre entier positif jusqu'à 200 inclus. | Oui |
q |
Abréviation de query. Exécute une requête Lucene. |
Non | Chaîne ou nombre | Oui | |
query |
Exécute une requête Lucene. | Non | Chaîne ou nombre | Oui | |
ranges |
Cette zone définit des plages pour les zones de recherche numériques à facettes. La valeur est un objet JSON dans lequel les noms de zone sont des zones de recherche numériques à facettes et les valeurs des zones sont des objets JSON.
Les noms de zone des objets JSON sont des noms de plage. Les valeurs sont des chaînes qui décrivent la plage, par exemple "[0 TO 10]". |
Oui | JSON | La valeur doit être un objet avec des zones dont les valeurs sont des objets. Ces objets doivent avoir des chaînes dont les valeurs de zone sont des plages. | Non |
sort |
Spécifie l'ordre de tri des résultats. Dans une recherche groupée (lorsque group_field est utilisé), ce paramètre spécifie l'ordre de tri dans un groupe. L'ordre de tri par défaut est la pertinence. |
Oui | JSON | Une chaîne JSON du format "fieldname<type>" ou -fieldname<type> pour l'ordre décroissant. fieldname est le nom d'une zone de chaîne ou numérique et type est un
nombre, une chaîne ou un tableau JSON de chaînes. La partie type est facultative et est number par défaut. Certains exemples sont "foo", "-foo", "bar<string>",
"-foo<number>"et ["-foo<number>","bar<string>"]. Les zones de chaîne utilisées pour le tri ne doivent pas être des zones analysées. Les zones utilisées pour
le tri doivent être indexées par le même indexeur que celui qui est utilisé pour la requête de recherche. |
Oui |
stale |
Permet de ne pas attendre que l'index ait terminé de générer les résultats à renvoyer. | Oui | Chaîne | OK | Oui |
Ne combinez pas les options bookmark et stale. Ces options limitent le choix des répliques de fragment à utiliser pour la réponse. Lorsqu'elles sont utilisées ensemble, elles peuvent générer des problèmes lorsque
vous essayez de contacter des répliques qui sont lentes ou indisponibles.
L'utilisation d'include_docs=true peut avoir une incidence sur les performances.
Pertinence
Lorsque plusieurs résultats sont renvoyés, il est possible de les trier. Par défaut, l'ordre de tri est déterminé en fonction de la "pertinence".
La pertinence est mesurée selon
le système de notation Lucene de Apache. Par exemple, si vous recherchez le mot example dans une base de données simple, il se
peut que deux documents contienne le mot. Si un document mentionne le mot example 10 fois mais que le deuxième document ne le mentionne que 2 fois, le premier document est considéré comme plus "pertinent".
Si vous ne fournissez pas de paramètre sort, la pertinence est utilisée par défaut. Les correspondances dont le score est le plus élevé sont renvoyées en premier.
Si vous fournissez un paramètre sort, les correspondances sont renvoyées dans cet ordre, sans tenir compte de la pertinence.
Si vous souhaitez utiliser un paramètre sort et inclure également le critère de pertinence dans vos résultats de recherche, utilisez les zones spéciales -<score> ou <score> dans le paramètre
sort.
Publication de requêtes de recherche avec POST
Au lieu d'utiliser la méthode HTTP GET, vous pouvez aussi utiliser POST. L'avantage principal des requêtes POST est le suivant : elles peuvent avoir un corps de demande. Ainsi, vous pouvez spécifier la
demande sous forme d'objet JSON. Chaque paramètre dans le tableau précédent correspond à une zone dans l'objet JSON dans le corps de demande.
Voici un exemple qui utilise HTTP pour publier avec POST une demande de recherche :
POST /db/_design/ddoc/_search/searchname HTTP/1.1
Content-Type: application/json
Host: $ACCOUNT.cloudant.com
Voici un exemple qui utilise la ligne de commande pour publier avec POST une demande de recherche :
curl "https://$ACCOUNT.cloudant.com/$DATABASE/_design/$DDOC/_search/$INDEX_NAME" -X POST -H "Content-Type: application/json" -d @search.json
Voici un exemple de document JSON qui inclut une demande de recherche :
{
"q": "index:my query",
"sort": "foo",
"limit": 3
}
Pagination
Utiliser la pagination des signets pour les requêtes de recherche. Pour plus de détails et d'exemples, voir la rubrique de la documentation de l'API intitulée Paging on search index queries(pagination sur les requêtes d'index de recherche).
Syntaxe de requête
La syntaxe des requêtes de recherche d' IBM Cloudant s repose sur la
syntaxe de Lucene. Les requêtes de recherche sont au format name:value sauf si le nom est omis, auquel cas elles utilisent la zone par défaut, comme illustré dans les exemples suivants :
Voici des exemples d'expression de requête de recherche :
// 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
*:*
Les requêtes sur plusieurs zones peuvent être combinées logiquement et les groupes et zones peuvent être regroupés plus précisément. Les opérateurs logiques disponibles sont sensibles à la casse ; il s'agit de AND,
+,
OR,
NOT et -. Des requêtes de plage peuvent être exécutées sur des chaînes ou des nombres.
Si vous voulez effectuer une recherche avec correspondance partielle, vous pouvez exécuter une requête avec ~ pour rechercher des termes similaires au terme de recherche. Par exemple,
look~ donne les expressions book et took.
Si les limites supérieures d'une requête de plage sont des chaînes contenant uniquement des chiffres, elles sont traitées comme des nombres et non comme des chaînes. Par exemple, si vous effectuez une recherche en utilisant la requête mod_date:["20170101" TO "20171231"],
les résultats incluent les documents pour lesquels mod_date est compris entre les valeurs numériques 20170101 et 20171231, et non entre les chaînes "20170101" et "20171231".
Vous pouvez modifier l'importance d'un terme de recherche en ajoutant ^ et un nombre positif. Cette altération crée des correspondances qui contiennent le terme de façon plus ou moins pertinente, proportionnellement à la puissance
de la valeur de pondération. La valeur par défaut est 1, ce qui signifie que la puissance de la correspondance n'est ni augmentée ni diminuée. La valeur décimale 0 ou 1 diminue l'importance et affaiblit la correspondance. Une valeur supérieure
à 1 augmente l'importance et renforce la correspondance.
Les recherches de caractères génériques sont prises en charge pour les recherches de caractères simples (?) et multiples (*). Par exemple :
dat? correspondrait à date et data, et dat* correspondrait à date,data,database, et dates. Les caractères génériques doivent être situés
après le terme de recherche.
Utilisez *:* pour renvoyer tous les résultats.
Les ensembles de résultats des recherches ne peuvent pas contenir plus de 200 lignes et en contiennent 25 par défaut. Vous pouvez changer le nombre de lignes renvoyées avec le paramètre limit.
Si la requête de recherche ne spécifie pas l'argument "group_field", la réponse inclut un signet. Si ce signet est fourni ultérieurement en tant que paramètre d'URL, la réponse ignore les lignes qui ont déjà été envoyées,
ce qui accélère et facilite l'obtention de l'ensemble de résultats suivant.
La réponse n'inclut jamais de signet si le paramètre "group_field" est inclus dans la requête de recherche.
Les options group_field, group_limit et group_sort ne sont disponibles que lorsque vous effectuez des requêtes globales.
Vous devez mettre en échappement les caractères suivants si vous voulez les rechercher :
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /
Pour échapper à l'un de ces caractères, insérez avant une barre oblique inversée (\).
La réponse à une requête de recherche inclut une zone order pour chaque résultat. La zone order est un tableau dans lequel le premier élément est la ou les zones spécifiées dans le paramètre sort. Si aucun
paramètre « sort » n'est inclus dans la requête, alors le champ « order » contient le score de pertinence Lucene.
Si vous utilisez la fonction de sort by distance comme décrit dans Recherches géographiques, le premier élément est la distance à partir d'un point. La distance est mesurée en kilomètres ou
miles.
Le deuxième élément dans le tableau de tri peut être ignoré. Il est utilisé pour le traitement des incidents uniquement.
Création de facettes
IBM Cloudant Search prend également en charge la recherche par facettes, qui permet une reconnaissance rapide et facile des informations agrégées sur les correspondances. Vous pouvez faire correspondre tous les documents à l'aide de la syntaxe
de requête ?q=*:* spéciale et utiliser les facettes renvoyées pour affiner votre requête. Afin d'indiquer qu'une zone doit être indexée pour les requêtes par facettes, définissez {"facet": true} dans ses
options.
Voici un exemple de requête de recherche qui spécifie que la recherche par facettes est activée :
function(doc) {
index("type", doc.type, {"facet": true});
index("price", doc.price, {"facet": true});
}
Pour que vous puissiez utiliser des facettes, tous les documents de l'index doivent inclure toutes les zones pour lesquelles les facettes sont activées. Si vos documents n'incluent pas toutes les zones, une erreur bad_request s'affiche
et indique que la zone field_name n'existe pas. Si chacun des documents ne contient pas toutes les zones pour les facettes, créez des index distincts pour chaque zone. Si vous ne créez pas d'index distinct pour chaque zone, vous
devez inclure uniquement des documents contenant toutes les zones. Vérifiez que les zones existent dans chaque document à l'aide d'une instruction if unique.
Voici un exemple d'instruction if permettant de vérifier que les zones requises existent dans chaque document :
if (typeof doc.town == "string" && typeof doc.name == "string") {
index("town", doc.town, {facet: true});
index("name", doc.name, {facet: true});
}
Comptes
L'option counts est disponible uniquement pour les requêtes globales.
La syntaxe de facette counts admet une liste de zones et renvoie le nombre de résultats de requête pour chaque valeur unique de chaque zone nommée.
L'opération count fonctionne uniquement sur les valeurs indexées sont des chaînes. Les valeurs indexées ne peuvent pas être de différents types. Par exemple, si 100 chaînes et un nombre sont indexés, l'index ne peut pas être utilisé
pour les opérations count. Vous pouvez vérifier le type en utilisant l'opérateur typeof et le convertir en utilisant une fonction parseInt,
parseFloat ou .toString().
Voici un exemple de requête qui utilise la syntaxe de facette counts :
?q=*:*&counts=["type"]
Voici un exemple de réponse suite à l'utilisation de la syntaxe de facette counts :
{
"total_rows":100000,
"bookmark":"g...",
"rows":[...],
"counts":{
"type":{
"sofa": 10,
"chair": 100,
"lamp": 97
}
}
}
drilldown
L'option drilldown est disponible uniquement pour les requêtes globales.
Vous pouvez limiter les résultats aux documents dont la dimension est égale au libellé spécifié. Restreignez les résultats en ajoutant drilldown=["dimension","label"] à une requête de recherche. Vous pouvez
inclure plusieurs paramètres drilldown pour restreindre les résultats en fonction de plusieurs dimensions.
L'utilisation d'un paramètre drilldown est similaire à l'utilisation de key:value dans le paramètre q, mais le paramètre drilldown renvoie les valeurs que l'analyseur pourrait ignorer.
Par exemple, si l'analyseur n'a pas indexé un mot vide tel que "a", le paramètre drilldown le renvoie lorsque vous spécifiez drilldown=["key","a"].
Gammes
L'option ranges est disponible uniquement pour les requêtes globales.
La syntaxe de facette range réutilise la syntaxe Lucene standard pour les plages afin de renvoyer les nombres de résultats qui conviennent pour chaque catégorie spécifiée. Les requêtes de plage inclusive sont placées entre crochets
([, ]). Les requêtes de plage exclusive sont placées entre accolades ({, }).
Les valeurs indexées ne peuvent pas être de différents types. Par exemple, si 100 chaînes et un nombre sont indexés, l'index ne peut pas être utilisé pour les opérations range. Vous pouvez vérifier le type en utilisant l'opérateur
typeof et le convertir en utilisant une fonction parseInt,
parseFloat ou .toString().
Voici un exemple de demande qui utilise la recherche par facettes pour la mise en correspondance avec ranges :
?q=*:*&ranges={"price":{"cheap":"[0 TO 100]","expensive":"{100 TO Infinity}"}}
Voici un exemple de résultats suite à une vérification ranges dans une recherche par facettes :
{
"total_rows":100000,
"bookmark":"g...",
"rows":[...],
"ranges": {
"price": {
"expensive": 278682,
"cheap": 257023
}
}
}
Recherches géographiques
En plus de la recherche par contenu de zones de texte, vous pouvez également trier vos résultats en fonction de leur distance par rapport à une coordonnée géographique.
Pour trier vos résultats ainsi, vous devez indexer deux zones numériques représentant la longitude et la latitude.
Vous pouvez ensuite effectuer une requête à l'aide de la zone de tri spéciale <distance...>, ce qui prend cinq paramètres :
- Nom de la zone de longitude : nom de votre zone de longitude (
mylondans l'exemple). - Nom de la zone de latitude : nom de votre zone de latitude (
mylatdans l'exemple). - Longitude de l'origine : longitude de l'emplacement en fonction duquel vous voulez effectuer un tri selon la distance.
- Latitude de l'origine : latitude de l'emplacement en fonction duquel vous voulez effectuer un tri selon la distance.
- Unités : les unités pouvant être utilisées sont
kmpour kilomètres etmipour miles. La distance est renvoyée dans la zone de tri.
Vous pouvez associer le tri par distance à n'importe quelle autre requête de recherche, telle que les recherches par plage de latitude et de longitude, ou les requêtes portant sur des informations non géographiques.
Ainsi, vous pouvez effectuer une recherche dans une boîte de délimitation et restreindre la recherche à l'aide de critères supplémentaires.
Voici un exemple de données géographiques :
{
"name":"Aberdeen, Scotland",
"lat":57.15,
"lon":-2.15,
"type":"city"
}
Voici un exemple de document de conception incluant un index de recherche pour les données géographiques :
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});
}
}
Voici un exemple utilisant HTTP pour une requête qui trie les villes de l'hémisphère nord en fonction de leur distance de New York :
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
Voici un exemple utilisant la ligne de commande pour une requête qui trie les villes de l'hémisphère nord en fonction de leur distance de New York :
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))
L'exemple précédent de Go requiert le bloc d'importation suivant :
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Voici un exemple de réponse (abrégée) incluant la liste des villes de l'hémisphère nord qui sont triées en fonction de leur distance de New York :
{
"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
}
}
]
}
Mise en évidence des termes de recherche
Parfois, il est utile d'obtenir le contexte dans lequel un terme de recherche a été mentionné afin de pouvoir afficher des résultats davantage mis en évidence pour un utilisateur.
Pour obtenir des résultats davantage mis en évidence, ajoutez le paramètre highlight_fields à la requête de recherche. Spécifiez les noms de zone pour lesquels vous voulez obtenir des extraits, dans lesquels le terme de recherche
est mis en évidence.
Par défaut, le terme de recherche est placé dans les balises <em> pour le mettre en évidence, mais la mise en évidence peut être remplacée à l'aide des paramètres highlights_pre_tag et highlights_post_tag.
Par défaut, la longueur des fragments est de 100 caractères. Vous pouvez demander une longueur différente avec le paramètre highlights_size.
Le paramètre highlights_number contrôle le nombre de fragments renvoyés. Sa valeur par défaut est 1.
Dans la réponse, la zone highlights est ajoutée, avec une sous-zone par nom de zone.
Pour chaque zone, vous obtenez un tableau de fragments dans lesquels le terme de recherche est mis en évidence.
Pour que la mise en évidence fonctionne, stockez la zone dans l'index à l'aide de l'option store: true.
Voici un exemple qui utilise HTTP pour effectuer une recherche avec mise en évidence activée :
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: ...
Voici un exemple illustrant la ligne de commande permettant d'effectuer une recherche avec la mise en évidence activée :
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))
L'exemple précédent de Go requiert le bloc d'importation suivant :
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Voici un exemple de résultats de recherche mis en évidence :
{
"highlights": {
"movie_name": [
" on the Azazel Orient Express",
" Azazel manuals, you"
]
}
}
Métadonnées d'index de recherche
Pour extraire des informations sur un index de recherche, vous envoyez une demande GET au noeud final _search_info, conformément à l'exemple ci-après.
DDOC référence un document de conception qui inclut l'index et INDEX_NAME est le nom de l'index.
Voici un exemple qui utilise HTTP pour demander des métadonnées d'index de recherche :
GET /$DATABASE/_design/$DDOC/_search_info/$INDEX_NAME HTTP/1.1
Voici un exemple qui utilise la ligne de commande pour demander des métadonnées d'index de recherche :
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))
L'exemple précédent de Go requiert le bloc d'importation suivant :
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
La réponse inclut des informations sur l'index, comme le nombre de documents dans l'index et la taille de l'index sur le disque.
Voici un exemple de réponse suite à la demande de métadonnées d'index de recherche :
{
"name": "_design/DDOC/INDEX",
"search_index": {
"pending_seq": 7125496,
"doc_del_count": 129180,
"doc_count": 1066173,
"disk_size": 728305827,
"committed_seq": 7125496
}
}