Conseil pour mapping index quiz


(Yoël Teixeira) #1

Bonjour,

Je découvre actuellement Elasticsearch et étant sans trop de connaissance je souhaite avoir de l'aide pour réaliser un mapping pour un jeu de quiz biblique, de la bonne manière. J'aurai besoin de quelques conseils et avis sur ce que j'ai déjà pensé.

Le jeu est multilingue. Pour l'instant j'utilise une langue par champ mais est-ce la bonne méthode dans ce cas ou faut-il plutôt utiliser un index par langue sachant que les langues des questions ne sont pas toutes mentionnées je voudrais en ajouter par la suite, au fur et à mesure. Est-ce que la modification d'un mapping sur un index avec des données est difficile ?

Pour les propositions de réponses et les thèmes j'utilise nested puisqu'il y aura une relation 1 à n, est-ce correct ?

Ici, le mapping de l'index "question" utilisé pour enregistrer des questions pour jeu de quiz biblique :

{
  "mapping": {
    "_doc": {
      "properties": {
        "answer": {
          "properties": {
            "en": {
              "type": "text",
              "analyzer": "english"
            },
            "es": {
              "type": "text",
              "analyzer": "spanish"
            },
            "fr": {
              "type": "text",
              "analyzer": "french"
            },
            "pt": {
              "type": "text",
              "analyzer": "portuguese"
            }
          }
        },
        "bible_api_reference": {
          "type": "text"
        },
        "bible_book": {
          "properties": {
            "en": {
              "type": "text",
              "analyzer": "english"
            },
            "es": {
              "type": "text",
              "analyzer": "spanish"
            },
            "fr": {
              "type": "text",
              "analyzer": "french"
            },
            "pt": {
              "type": "text",
              "analyzer": "portuguese"
            }
          }
        },
        "comment": {
          "properties": {
            "en": {
              "type": "text",
              "analyzer": "english"
            },
            "es": {
              "type": "text",
              "analyzer": "spanish"
            },
            "fr": {
              "type": "text",
              "analyzer": "french"
            },
            "pt": {
              "type": "text",
              "analyzer": "portuguese"
            }
          }
        },
        "level": {
          "type": "integer"
        },
        "propositions": {
          "properties": {
            "en": {
              "type": "nested",
              "properties": {
                "proposition": {
                  "type": "text",
                  "analyzer": "english"
                }
              }
            },
            "es": {
              "type": "nested",
              "properties": {
                "proposition": {
                  "type": "text",
                  "analyzer": "spanish"
                }
              }
            },
            "fr": {
              "type": "nested",
              "properties": {
                "proposition": {
                  "type": "text",
                  "analyzer": "french"
                }
              }
            },
            "pt": {
              "type": "nested",
              "properties": {
                "proposition": {
                  "type": "text",
                  "analyzer": "portuguese"
                }
              }
            }
          }
        },
        "question": {
          "properties": {
            "en": {
              "type": "text",
              "analyzer": "english"
            },
            "es": {
              "type": "text",
              "analyzer": "spanish"
            },
            "fr": {
              "type": "text",
              "analyzer": "french"
            },
            "pt": {
              "type": "text",
              "analyzer": "portuguese"
            }
          }
        },
        "themes": {
          "properties": {
            "en": {
              "type": "nested",
              "properties": {
                "theme": {
                  "type": "text",
                  "analyzer": "english"
                }
              }
            },
            "es": {
              "type": "nested",
              "properties": {
                "theme": {
                  "type": "text",
                  "analyzer": "spanish"
                }
              }
            },
            "fr": {
              "type": "nested",
              "properties": {
                "theme": {
                  "type": "text",
                  "analyzer": "french"
                }
              }
            },
            "pt": {
              "type": "nested",
              "properties": {
                "theme": {
                  "type": "text",
                  "analyzer": "portuguese"
                }
              }
            }
          }
        }
      }
    }
  }
}

(David Pilato) #2

Ta méthode est bonne. Néanmoins, je me dis qu'un index par langue est peut-être plus facile à gérer. Notamment si tu dois réindexer une langue parce que tu changes quelque chose, reindexer seulement une langue vs toutes les langues est peut-être plus flexible.

Je te recommande de lire ce chapitre: https://www.elastic.co/guide/en/elasticsearch/guide/current/language-intro.html

C'est ancien mais ça reste pour la plupart de bonnes pratiques.


(Yoël Teixeira) #3

Merci pour tout