Documents imbriqués dans Elasticsearch
Je suis en train d'écrire une application de gestion d'actifs. Il permet aux utilisateurs de stocker arbitraire de l'actif des attributs par l'ajout d'un contrôle html comme un champ de texte, sélectionnez menu, etc. à l'actif. Une représentation JSON de l'attribut devient alors une partie de l'actif JSON document stocké dans couchdb. Un actif a la structure suivante dans couchdb:
{
"_id": "9399fb27448b1e5dfdca0181620418d4",
"_rev": "12-fa50eae8b50f745f9852e9fab30ef5d9",
"type": "asset",
"attributes": [
{
"id": "9399fb27448b1e5dfdca01816203d609",
"type": "text",
"heading": "Brand",
"data": "",
"requiredBySystem": true
},
{
"id": "9399fb27448b1e5dfdca01816203e68e",
"type": "userSelectMenu",
"heading": "Assigned To",
"data": "",
"requiredBySystem": true
},
{
"id": "9399fb27448b1e5dfdca01816203e9c9",
"type": "categories",
"heading": "Categories",
"data": [
"0d7e6233e5f48b4f55c5376bf00b1be5",
"0d7e6233e5f48b4f55c5376bf00d94cf"
],
"requiredBySystem": true
},
{
"id": "9399fb27448b1e5dfdca01816207uy5a",
"type": "radio",
"heading": "Radio Buttons",
"data": [
{
"text": "Button 1",
"checked": false
},
{
"text": "Button 2",
"checked": true
}
],
"requiredBySystem": true
},
{
"id": "9399fb27448b1e5dfdca01816205tgh6",
"type": "checkboxes",
"heading": "Checkboxes",
"data": [
{
"text": "Box 1",
"checked": false
},
{
"text": "Box 2",
"checked": true
}
],
"requiredBySystem": true
},
{
"id": "9399fb27448b1e5dfdca0181620k81gt",
"type": "select",
"heading": "Select Menu",
"data": [
{
"text": "Option 1",
"checked": false
},
{
"text": "Option 2",
"checked": true
}
],
"requiredBySystem": true
}
]
}
Je ne sais pas si mettre des attributs dans un tableau est la meilleure façon de permettre à la recherche d'un actif en fonction de la valeur d'un attribut. Serait-il préférable de fixer l'attribut directement à l'actif en tant que propriété? Je suis en train d'expérimenter maintenant dans elasticsearch. Si j'essaie, et de stocker le document est, elasticsearch renvoie une erreur:
"erreur" : "MapperParsingException[Failed to parse [attributs.données]]; imbriquées: ElasticSearchIllegalArgumentException[propriété inconnue [texte]]; "
I"m en utilisant le mappage suivant:
"mappings" : {
"asset" : {
"properties" : {
"_id": {
"type" : "string",
"index" : "not_analyzed"
},
"_rev": {
"type" : "string",
"index" : "not_analyzed"
},
"type": {
"type" : "string",
"index" : "not_analyzed"
},
"attributes": {
"properties" : {
"id" : {
"type" : "string"
},
"type" : {
"type" : "string",
"index" : "not_analyzed"
},
"heading" : {
"type" : "string"
},
"data" : {
"type" : "string"
}
}
}
}
}
}
Ne sais pas où j'vais mal ici. Merci pour votre aide!
Troy
Vous devez vous connecter pour publier un commentaire.
Le problème résultant de la manière dont le document est structuré.
attribute.data
est à la fois une chaîne de caractères ou un tableau de chaînes de caractères et un plein, objet interne. ES ne permet pas le "type" d'une propriété à modifier.Fondamentalement, vous ne pouvez pas avoir ceci:
et ce:
dans le même document. La première instance de
data
dit ES que "les données est un tableau de chaînes de caractères". Mais ensuite, la deuxième instance dedata
dit "Hé, je suis un objet!", c'est pourquoi ES est de lancer une erreur.Vous pouvez contourner ce problème en déclarant explicitement
data
comme un objet, et le réglage de enabled: false, mais ce n'est probablement pas la solution que vous voulez (car qui dit juste ES pour stockerdata
comme un champ de texte, sans analyse.L'autre option consiste à restructurer vos données, ou de diviser les
data
dans le document (par exemple, Parent/Enfant, la cartographie)