Elasticsearch multilingue indexage des meilleures pratiques / expériences
on se demande quelles sont les meilleures pratiques ou expériences utilisées pour l'indexation multilingue et la recherche dans elasticsearch. J'ai lu un certain nombre de ressources, et du mieux que je peux la présenter de façon concise les options disponibles pour l'indexation sont:
indice séparé par langue;
multi type de champ pour le champ;
champ distinct pour toutes les langues possibles.
alors, je me demande ce que sont les effets secondaires pour choisir l'une ou l'autre de ces options (ou une autre que j'ai manqué). Je suppose qu'avoir plus d'indices ne ralentit pas vraiment le cluster (si ce n'est pas un grand nombre de langues), donc pas sûr de ce que je recevrais de choisir 2 ou 3, sauf peut-être une maintenance plus facile.
toute aide est la bienvenue!
3 réponses
une question un peu vieille, mais l'info pourrait être utile de toute façon.
La structure index/mapping dépend principalement de votre usecase.
Avez-vous besoin d'utiliser toutes les langues simultanément ou une seule langue est utilisée à la fois?
- Option 1: site web multilingue par exemple - les utilisateurs ne voient et ne cherchent que dans la langue qu'ils ont choisie. Dans ce cas, mon expérience est que les index-par-lang serait une bonne solution, surtout si vous avez besoin d'être mesure d'ajouter et de supprimer des langues facilement. Le montant des données est divisé entre les indices (avantage lié à la performance). Configuration facile des analyseurs pour chaque langue, surtout si leurs paramètres ne diffèrent que par le nom de la langue. Personnellement, j'utilise actuellement cette option pour un de mes projets
Notes générales pour les options 2 et 3: L'utilisation de l'une de ces options vous donne la possibilité de noter les documents différemment, en fonction de la langue que vous pouvez définir la notation pour chaque champ langue. Vous pouvez ajouter de nouveaux champs à un mappage si vous avez besoin d'ajouter plus de langues, mais il n'existe aucun moyen de supprimer ou de modifier les champs existants. Par conséquent, vous devrez réindexer tout votre contenu et définir la propriété pour que la langue supprimée soit vide. Vous aurez besoin d'ajouter de nouveaux analyseurs pour chaque nouvelle langue. Mais il faut d'abord fermer l'index et l'ouvrir après les modifications.
- Option 2: si vous en avez besoin recherche dans toutes les langues à la fois le champ multiple vous donne l'accès le plus facile puisque vous pouvez adresser tous ses sous-champs à la fois:
"book_title": { "type": "multi_field", "fields": { "english": { "type": "string" }, "german": { "type": "string" }, "italian": { "type": "string" }, } }
ici, vous pouvez rechercher dans une langue spécifique (ex.:"book_title.anglais") ou dans toutes les langues (en utilisant"book_title"). Vous devriez faire attention!--7--> pour mettre à jour le champ en utilisant "book_title" nom", mais en utilisant "book_title.[langue]". Utiliser "book_title " va conduire à mettre à jour tous les sous-champs avec des données identiques (ce qui n'est probablement pas ce que vous voulez)
Option 3: champs complètement séparés - vous aurez besoin de les mettre tous dans la requête de recherche Si vous avez besoin de rechercher comme dans l'option 2, plus sûr en termes d'indexation que vous ne pouvez pas écraser toutes les langues par erreur
Idée pour l'option 4 - type d'utilisation-par-la langue: peut être utilisé si vous n'avez qu'un seul type de documents. Vous pouvez avoir différents champs par langue. Pas utile si vous avez plusieurs types de documents
si d'autres personnes sont à la recherche de réponses, voici un lien direct vers la documentation sur le site ElasticSearch: https://www.elastic.co/guide/en/elasticsearch/guide/current/mixed-lang-fields.html
je voudrais aller avec option 1 (indice séparé par langue) tel que suggéré par la documentation Elasticsearch puisqu'il s'assure que vous évitez les problèmes de fréquence terme.
si votre document contient plusieurs langues, vous pouvez mettre plusieurs indices et utiliser champ s'effondrant requête à temps pour éviter les doublons d'un même document retourné.