J'ai ~ 250K fichiers XML, chacun d'entre eux étant nommé avec un UUID, et je veux faire une recherche en texte intégral sur ces fichiers et identifier l'UUID des fichiers correspondants. Quelle est la meilleure stratégie pour les indexer dans un environnement nodejs ?
Je pourrais importer les fichiers dans une base de données (disons, SQLite), puis utiliser un module de recherche en texte intégral (FTS5 dans le cas de SQLite). Mais je devrais en quelque sorte ignorer les balises XML.
Ou, je pourrais utiliser une sorte de module XMLPath pour nodejs pour extraire uniquement le texte et le stocker dans la base de données avec le nom du fichier, et ainsi de suite.
Ou, ce serait encore mieux si je pouvais éviter complètement d'importer dans la base de données puisque de cette façon, je n'aurais pas à faire face à la complexité de l'importation de nouveaux enregistrements dans la base de données.
Les suggestions de stratégie sont les bienvenues.
4 Réponses :
Il y a trois étapes:
Utilisez un analyseur XML pour lire les fichiers XML
Enregistrez l'UUID et l'emplacement des fichiers dans une table de base de données (ID (INT), UUID (varchar unique), emplacement des fichiers (json)). Si l'UUID existe, ajoutez le fichier dans la colonne d'emplacement des fichiers
Après le traitement, vous avez tous les emplacements de fichiers qui ont le même UUID dans la même ligne.
Vous pouvez payer mon npm :
Analyseur XML lien
oui, mais comment faire la recherche en texte intégral? Comment trouver tous les fichiers contenant le terme «toto»?
@punkish utilise regex pour rechercher dans chaque enregistrement contenant "foo" npmjs.com/package/regex
D'après votre réponse à la réponse de Marcia Ong, je ne sais plus exactement quelle est votre question. Voici donc la "vue d'ensemble":
Vous avez un tas de fichiers XML contenant un tas d'informations. Le moyen le plus efficace de récupérer des informations consiste à indexer ces fichiers.
Une condition préalable à "l'indexation" est "d'analyser" le XML. Je crois que c'est l'essentiel de la réponse de Marcia Ong. Cela semble être une bonne suggestion.
Autre problème: comment construisez-vous votre index. Quel EST votre index? C'est l'essentiel de mon commentaire. SQLite + FTS5 pourrait être un bon choix, Lucene pourrait également fonctionner. Vous avez de nombreuses options. Tout dépend de vos besoins, y compris de l'environnement dans lequel vous allez déployer votre application.
Encore un autre problème à prendre en compte: voulez-vous stocker physiquement le XML au même endroit que votre index (par exemple, une base de données SQLite), ou votre index sera-t-il simplement "lié" au fichier XML? Par exemple, un chemin de fichier sur un partage réseau, ou un chemin relatif sur votre serveur Web, etc.
Le dernier problème: Q: Comment votre application interroge-t-elle l'index et renvoie les résultats? R: "Cela dépend". Cela dépend entièrement de la technologie avec laquelle vous choisissez d'indexer, de la langue dans laquelle votre application est programmée, des informations que vous souhaitez réellement récupérer de votre XML et de nombreuses autres variables.
Par exemple:
Supposons que vous soyez sur un serveur Linux, et supposons que vous choisissiez Lucene (SQLite fonctionne aussi sous Linux, BTW ...)
Vous pourriez avoir un travail par lots de nuit pour analyser vos fichiers XML et mettre à jour vos index.
Votre application peut effectuer l'une des opérations suivantes:
Vous devez charger les fichiers XML dans une base de données XML. Les bases de données XML les plus populaires aujourd'hui semblent être BaseX, eXist et MarkLogic. Les deux premiers sont open source, le dernier est commercial. Je crois que tous offrent une capacité de recherche de texte intégral ainsi que (et intégré avec) XQuery. Vous devrez configurer la base de données choisie pour définir comment vous voulez que les données soient indexées.
(Les bases de données relationnelles telles qu'Oracle, SQL Server et DB2 proposent également des modules complémentaires XML, mais je n'irais pas dans cette voie en raison de la complexité).
J'ai décidé d'utiliser la route SQLite3 / FTS5. J'analyse les fichiers XML avec xml2js et je les stocke dans SQLite. J'ai une table virtuelle avec l'index de texte intégral que je peux rechercher très rapidement. Sur la suggestion de Michael Kay , j'ai essayé BaseX mais il n'y avait tout simplement aucune comparaison. BaseX a pris ~ 32 minutes pour importer ~ 250K fichiers XML pour créer une base de données ~ 6 Go. La recherche d'un terme a duré 2m 44s. La base de données SQLite avec les tables FTS5 est d'environ 9 Go. La même recherche prend 0,001 seconde.
Calendrier:
- Analyse: 34,15 ms
- Compilation: 28,32 ms
- Évaluation: 163172.13 ms
- Impression: 537,65 ms
- Temps total: 163772.26 ms
Exécution: 0,001 utilisateur réel 0,000790 sys 0,000165
Tout dépend de vos besoins, y compris de l'environnement dans lequel vous allez déployer votre application. Si vous êtes déjà à l'aise avec SQLite, c'est parfait. Sinon, vous pouvez envisager quelque chose comme Lucene : npmjs.com/package/lucene