Elasticsearch créer un champ de jointure (Nodejs)

Nov 21 2020

J'ai les documents suivants:

export class CustomerServiceResultType{
  id: string;
  body:{customerRelation: string};
}

export class CustomerType{
  id: string;
  body:{name: string};
}

Je veux CustomerServiceResultTypeavoir une relation CustomerTypeavec 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

1 JoeSorocin Nov 26 2020 at 20:54

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' typeaspect obsolète d'ES, les deux concepts sont très éloignés.