Elasticsearch créer un champ de jointure (Nodejs)
J'ai les documents suivants:
export class CustomerServiceResultType{
id: string;
body:{customerRelation: string};
}
export class CustomerType{
id: string;
body:{name: string};
}
Je veux CustomerServiceResultType
avoir une relation CustomerType
avec le champ: customerRelation
.
c'est ma cartographie:
await this.elasticsearchService.indices.putMapping({
"index": "db",
"type": "CustomerServiceResultType",
"body" : {
"properties": {
"customerRelation": {
"type": "join",
"relations": {
"CustomerServiceResultType": "CustomerType"
}
}
}
}
});
Voici l'erreur que j'obtiens:
[Nest] 421512 - 11/21/2020, 6:40:42 PM [ExceptionsHandler] illegal_argument_exception +96414ms
ResponseError: illegal_argument_exception
Il n'y a pas de détails sur cette erreur ...
Merci
Réponses
Il est faux de rien avec votre demande par-soi - je pense qu'il nécessite juste une option supplémentaire: include_type_name: true
.
C'est undefinedpar défaut dans nodejs mais est requis dans ES 7.x côté serveur. Plus de raisonnement derrière cela est ici .
Cela devrait donc faire l'affaire:
await client.indices.putMapping({
include_type_name: true,
index: "db",
type: "CustomerServiceResultType",
body : {
properties: {
customerRelation: {
type: "join",
relations: {
CustomerServiceResultType: "CustomerType"
}
}
}
}
});
Les index typés seront supprimés dans 8.x donc la meilleure approche serait en fait:
await client.indices.putMapping({
index: "db",
body : {
properties: {
customerRelation: {
type: "join",
relations: {
CustomerServiceResultType: "CustomerType"
}
}
}
}
});
BTW: vos types dactylographiés ne jouent pas vraiment un rôle ici car ES est une interface uniquement JSON et bien qu'il y ait l' type
aspect obsolète d'ES, les deux concepts sont très éloignés.