Elastic Search for goblins
npm install goblin-elasticsearchLe module goblin-elasticsearch est un service d'indexation et de recherche basé sur Elasticsearch pour l'écosystÚme Xcraft. Il fournit une interface complÚte pour indexer, rechercher et gérer des documents dans Elasticsearch, avec des fonctionnalités avancées comme la recherche phonétique, l'autocomplétion et la recherche floue. Le module inclut également un systÚme de "hinters" pour créer des interfaces de recherche interactives dans les applications Xcraft.
- Structure du module
- Fonctionnement global
- Exemples d'utilisation
- Interactions avec d'autres modules
- Configuration avancée
- Détails des sources
Le module est organisé autour de trois composants principaux :
- Service Elasticsearch (lib/service.js) : Acteur Goblin principal qui gÚre la connexion et les opérations Elasticsearch
- Builders (lib/builders.js) : Factory pour créer des "hinters" (composants de recherche interactive)
- Indexer Report (lib/indexerReport.js) : Utilitaires pour générer des rapports d'indexation
- Point d'entrée (elastic.js) : Expose les commandes du service sur le bus Xcraft
Le module fonctionne selon une architecture en couches :
1. Couche de connexion : Ătablit et maintient la connexion avec le cluster Elasticsearch
2. Couche d'indexation : GÚre la création d'index, le mapping des types et l'indexation des documents
3. Couche de recherche : Fournit des capacités de recherche avancées (fulltext, phonétique, autocomplétion)
4. Couche d'interface : GénÚre des composants "hinter" pour l'intégration dans les interfaces utilisateur
Le service utilise des analyseurs personnalisés pour optimiser la recherche :
- Autocomplete : Recherche par préfixe avec n-grammes (1-20 caractÚres)
- Phonetic : Recherche phonétique avec l'algorithme Beider-Morse
- Info : Recherche standard avec normalisation ASCII et filtres de mots vides configurables
Le systÚme de verrouillage limite les opérations bulk à 50 appels simultanés pour éviter de surcharger Elasticsearch.
``javascript
// Création du service
const elasticAPI = await this.quest.create('elastic', {
id: 'elastic@mandate',
url: 'http://localhost:9200',
index: 'my-application-index',
});
// Recherche de documents avec mode fulltext
const results = await elasticAPI.search({
type: 'person',
value: 'john doe',
searchMode: 'fulltext',
size: 20,
});
// Recherche avec mode mixte (fulltext + termes exacts)
const mixedResults = await elasticAPI.search({
type: 'person',
value: ['john', 'doe'],
searchMode: 'mixed',
termQueryFields: ['status', 'category'],
dateQueryFields: ['birthDate'],
});
`
`javascript
// Indexation d'un document unique
await elasticAPI.index({
type: 'person',
documentId: 'person-123',
document: {
'info': 'John Doe',
'searchAutocomplete': 'John Doe',
'searchPhonetic': 'John Doe',
'meta/status': 'active',
'glyph': 'solid/user',
},
});
// Indexation en lot avec rapport détaillé
const bulkBody = [
{index: {_type: 'person', _id: 'person-123'}},
{
info: 'John Doe',
searchAutocomplete: 'John Doe',
searchPhonetic: 'John Doe',
},
{index: {_type: 'person', _id: 'person-124'}},
{
info: 'Jane Smith',
searchAutocomplete: 'Jane Smith',
searchPhonetic: 'Jane Smith',
},
];
const report = await elasticAPI.bulk({
body: bulkBody,
withInfo: true,
byType: true,
});
`
`javascript
const {buildHinter} = require('goblin-elasticsearch/lib/builders.js');
// Configuration du hinter
const PersonHinter = buildHinter({
name: 'person-search',
type: 'person',
detailType: 'person',
valueField: 'id',
title: 'Recherche de personnes',
newButtonTitle: 'Nouvelle personne',
subTypes: ['employee', 'customer'],
subJoins: ['parentId'],
});
// Utilisation dans un acteur
const hinterAPI = await this.quest.create('person-hinter', {
id: person-hinter@${this.quest.uuidV4()}$,`
desktopId,
hinterName: 'main-search',
withDetails: true,
detailWidget: 'person-workitem',
statusFilter: [{name: 'status', value: ['archived']}],
});
`javascript
// Génération de facettes pour les filtres
const facets = await elasticAPI.generateFacets({
type: 'person',
facets: [
{name: 'status', field: 'meta/status', type: 'keyword'},
{name: 'birthDate', field: 'birthDate', type: 'date'},
],
});
// Recherche avec filtres basés sur les facettes
const filteredResults = await elasticAPI.search({
type: 'person',
value: 'john',
filters: [
{name: 'meta/status', value: ['active', 'pending']},
{name: 'birthDate', value: {from: '1980-01-01', to: '1990-12-31'}},
],
});
`
Le module interagit étroitement avec :
- [goblin-workshop] : Utilise les composants hinter pour l'interface de recherche et la gestion des workitems
- [xcraft-core-etc] : Pour la gestion de la configuration (stopwords, multi-langue)
- [xcraft-core-goblin] : Framework de base pour les acteurs Goblin
- [xcraft-core-converters] : Pour la conversion des dates dans les recherches mixtes
- [xcraft-core-utils] : Utilise le systÚme de verrous pour limiter la concurrence des opérations bulk
| Option | Description | Type | Valeur par défaut |
| ----------- | ------------------------------------- | ----- | ---------------------- |
| stopwords | Liste des langues pour les mots vides | Array | ['french', 'german'] |
Le module ne définit pas de variables d'environnement spécifiques mais utilise la configuration du workshop pour le support multi-langue via workshopConfig.enableMultiLanguageIndex.
Point d'entrée principal du module qui expose les commandes Elasticsearch sur le bus Xcraft. Ce fichier simple redirige vers le service principal défini dans lib/service.js.
Service principal qui expose toutes les commandes Elasticsearch via le bus Xcraft. Il gĂšre :
- Connexion : Ătablit la connexion avec le cluster Elasticsearch avec vĂ©rification de santĂ© (timeout 30s)
- Gestion d'index : Création, suppression et configuration des index avec analyseurs personnalisés
- Recherche avancée : Support de multiple modes de recherche (fulltext, mixed) avec highlighting et pagination
- Indexation : Opérations d'indexation unitaires et en lot avec rapports détaillés
- Facettes : Génération d'agrégations pour les filtres d'interface
- Scroll API : Support de la pagination avancée pour de gros volumes de données
#### Méthodes publiques
- create(url, index) â Initialise le service avec l'URL Elasticsearch et le nom d'index, vĂ©rifie la disponibilitĂ© du cluster
- search(type, value, filters, sort, from, searchAfter, size, mustExist, fuzzy, source, scroll, termQueryFields, dateQueryFields, highlightedFields, searchMode, fullTextFields) â Effectue une recherche avec support complet de filtres, tri, pagination et highlighting
- index(type, documentId, document) â Indexe un document unique avec logging du rĂ©sultat
- unindex(type, documentId) â Supprime un document de l'index avec gestion des erreurs
- bulk(body, withInfo, byType) â Indexe plusieurs documents en une opĂ©ration avec rapport optionnel et limitation de concurrence (50 appels max)
- count(type) â Retourne le nombre de documents d'un type donnĂ©
- match(type, field, value) â Recherche exacte sur un champ spĂ©cifique avec opĂ©rateur AND
- multi-match(type, fields, value) â Recherche sur plusieurs champs simultanĂ©ment
- scroll(scrollId) â Continue une recherche paginĂ©e avec l'API scroll
- clear-scroll(scrollId) â LibĂšre les ressources d'une recherche scroll
- ensure-index() â CrĂ©e l'index s'il n'existe pas avec la configuration d'analyseurs et filtres de stopwords
- ensure-type(type, fields) â CrĂ©e le mapping d'un type avec les champs de recherche standard (searchAutocomplete, searchPhonetic, info)
- put-mapping(type, properties) â Met Ă jour le mapping d'un type existant
- reset-index() â Supprime et recrĂ©e l'index complĂštement
- delete-index() â Supprime dĂ©finitivement l'index
- reset-all-indices() â Supprime tous les index Elasticsearch (opĂ©ration dangereuse)
- generate-facets(type, facets) â GĂ©nĂšre des agrĂ©gations pour les facettes d'interface avec support des types keyword et date
Factory pour créer des acteurs "hinter" qui fournissent des interfaces de recherche interactives. Chaque hinter :
- Se connecte automatiquement au service workshop pour l'affichage
- Effectue des recherches en temps réel via Elasticsearch avec auto-fetch initial
- GÚre le highlighting des résultats avec préférence phonétique intelligente
- Support des sous-types et jointures pour des recherches complexes
- Gestion des filtres de statut et des payloads personnalisés
#### Configuration du hinter
La factory accepte une configuration complĂšte avec :
- name : Nom personnalisé du hinter (optionnel, utilise ${type}-hinter par défaut)type
- : Type de document principal Ă rechercherdetailType
- : Type pour l'affichage des détails (optionnel)detailPath
- et detailResolvePath : Chemins pour la résolution des détailssubTypes
- : Types additionnels Ă inclure dans la recherchesubJoins
- : Champs de jointure pour les sous-typesvalueField
- : Champ Ă utiliser comme valeur de retournewWorkitem
- : Configuration pour créer de nouveaux élémentstitle
- et newButtonTitle : Titres pour l'interface
#### Méthodes des hinters générés
- create(desktopId, hinterName, workitemId, withDetails, detailWidget, detailWidth, detailKind, statusFilter) â CrĂ©e une instance de hinter avec configuration complĂšte
- search(value, searchMode, size) â Effectue une recherche avec highlighting intelligent et gestion des rĂ©sultats phonĂ©tiques/autocomplĂ©tion
- set-status(status) â Applique des filtres de statut dynamiquement
Utilitaires pour analyser les résultats d'opérations d'indexation en lot et générer des rapports détaillés avec gestion des erreurs.
#### Fonctions utilitaires
- buildBulkReport(indexed) â GĂ©nĂšre un rapport global avec compteurs de documents créés, mis Ă jour, supprimĂ©s, Ă©chouĂ©s et dĂ©tails des erreurs
- buildBulkReportByType(indexed) â GĂ©nĂšre un rapport dĂ©taillĂ© par type de document avec la mĂȘme granularitĂ©
Les rapports incluent la structure :
`javascript``
{
created: number,
updated: number,
deleted: number,
failed: number,
total: number,
errors: {[documentId]: string}
}
---
_Documentation mise Ă jour_
[goblin-workshop]: https://github.com/Xcraft-Inc/goblin-workshop
[xcraft-core-etc]: https://github.com/Xcraft-Inc/xcraft-core-etc
[xcraft-core-goblin]: https://github.com/Xcraft-Inc/xcraft-core-goblin
[xcraft-core-converters]: https://github.com/Xcraft-Inc/xcraft-core-converters
[xcraft-core-utils]: https://github.com/Xcraft-Inc/xcraft-core-utils