️ Ce client est obsolète️ À partir de la version 8.3.2 d'Enterprise Search, nous dirigeons les utilisateurs vers le nouveau client Enterprise Search Node et abandonnons ce client.
Notre effort de développement sur ce projet se limitera à la correction de bugs. Toutes les améliorations futures seront concentrées sur le client Enterprise Search Node.
Merci! - Élastique
Un client Node.JS propriétaire permettant de créer des expériences de recherche excellentes et pertinentes avec Elastic App Search.
Pour installer ce package, exécutez :
npm install @elastic/app-search-node
Ce client est versionné et publié avec App Search.
Pour garantir la compatibilité, utilisez la version la plus récente de cette bibliothèque dans la version majeure de l'implémentation App Search correspondante.
Par exemple, pour App Search 7.3
, utilisez 7.3
de cette bibliothèque ou une version ultérieure, mais pas 8.0
.
Si vous utilisez la version SaaS disponible sur swiftype.com d'App Search, vous devez utiliser la version 7.5.x du client.
L'utilisation de ce client suppose que vous disposez déjà d'une instance d'Elastic App Search opérationnelle.
Le client est configuré à l'aide des paramètres baseUrlFn
et apiKey
.
const apiKey = 'private-mu75psc5egt9ppzuycnc2mc3'
const baseUrlFn = ( ) => 'http://localhost:3002/api/as/v1/'
const client = new AppSearchClient ( undefined , apiKey , baseUrlFn )
Note:
L' [apiKey]
authentifie les requêtes adressées à l'API. Vous pouvez utiliser n'importe quel type de clé avec le client, mais chacun a une portée différente. Pour plus d’informations sur les clés, consultez la documentation.
Lorsque vous utilisez la version SaaS disponible sur Swiftype.com d'App Search, vous pouvez configurer le client à l'aide de votre hostIdentifier
au lieu du paramètre baseUrlFn
. L' hostIdentifier
se trouve dans le menu Informations d'identification.
const AppSearchClient = require ( '@elastic/app-search-node' )
const hostIdentifier = 'host-c5s2mj'
const apiKey = 'private-mu75psc5egt9ppzuycnc2mc3'
const client = new AppSearchClient ( hostIdentifier , apiKey )
const engineName = 'favorite-videos'
const documents = [
{
id : 'INscMGmhmX4' ,
url : 'https://www.youtube.com/watch?v=INscMGmhmX4' ,
title : 'The Original Grumpy Cat' ,
body : 'A wonderful video of a magnificent cat.'
} ,
{
id : 'JNDFojsd02' ,
url : 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' ,
title : 'Another Grumpy Cat' ,
body : 'A great video of another cool cat.'
}
]
client
. indexDocuments ( engineName , documents )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error ) )
Notez que cette API ne générera pas d’erreur d’indexation. Les erreurs sont intégrées dans le corps de la réponse par document :
[
{ "id" : " park_rocky-mountain " , "errors" : [] },
{
"id" : " park_saguaro " ,
"errors" : [ " Invalid field value: Value 'foo' cannot be parsed as a float " ]
}
]
const engineName = 'favorite-videos'
const documents = [
{
id : 'INscMGmhmX4' ,
title : 'Updated title'
}
]
client
. updateDocuments ( engineName , documents )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error ) )
const engineName = 'favorite-videos'
const documentIds = [ 'INscMGmhmX4' , 'JNDFojsd02' ]
client
. getDocuments ( engineName , documentIds )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
// Without paging
client
. listDocuments ( engineName )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
// With paging
client
. listDocuments ( engineName , { page : { size : 10 , current : 1 } } )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
const documentIds = [ 'INscMGmhmX4' , 'JNDFojsd02' ]
client
. destroyDocuments ( engineName , documentIds )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
client
. listEngines ( { page : { size : 10 , current : 1 } } )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
client
. getEngine ( engineName )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
client
. createEngine ( engineName , { language : 'en' } )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
client
. destroyEngine ( engineName )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
const query = 'cat'
const searchFields = { title : { } }
const resultFields = { title : { raw : { } } }
const options = { search_fields : searchFields , result_fields : resultFields }
client
. search ( engineName , query , options )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
const searches = [
{ query : 'cat' , options : {
search_fields : { title : { } } ,
result_fields : { title : { raw : { } } }
} } ,
{ query : 'grumpy' , options : { } }
]
client
. multiSearch ( engineName , searches )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
const options = {
size : 3 ,
types : {
documents : {
fields : [ 'title' ]
}
}
}
client
. querySuggestion ( engineName , 'cat' , options )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
client
. listCurations ( engineName )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
// Pagination details are optional
const paginationDetails = {
page : {
current : 2 ,
size : 10
}
}
client
. listCurations ( engineName , paginationDetails )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
const curationId = 'cur-7438290'
client
. getCuration ( engineName , curationId )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
const newCuration = {
queries : [ 'cat blop' ] ,
promoted : [ 'Jdas78932' ] ,
hidden : [ 'INscMGmhmX4' , 'JNDFojsd02' ]
}
client
. createCuration ( engineName , newCuration )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
const curationId = 'cur-7438290'
// "queries" is required, either "promoted" or "hidden" is required.
// Values sent for all fields will overwrite existing values.
const newDetails = {
queries : [ 'cat blop' ] ,
promoted : [ 'Jdas78932' , 'JFayf782' ]
}
client
. updateCuration ( engineName , curationId , newDetails )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
const curationId = 'cur-7438290'
client
. destroyCuration ( engineName , curationId )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
client
. getSchema ( engineName )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'favorite-videos'
const schema = {
views : 'number' ,
created_at : 'date'
}
client
. updateSchema ( engineName , schema )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
Création d'une clé de recherche qui renverra uniquement le champ de titre.
const publicSearchKey = 'search-xxxxxxxxxxxxxxxxxxxxxxxx'
// This name must match the name of the key above from your App Search dashboard
const publicSearchKeyName = 'search-key'
const enforcedOptions = {
result_fields : { title : { raw : { } } } ,
filters : { world_heritage_site : 'true' }
}
// Optional. See https://github.com/auth0/node-jsonwebtoken#usage for all options
const signOptions = {
expiresIn : '5 minutes'
}
const signedSearchKey = AppSearchClient . createSignedSearchKey (
publicSearchKey ,
publicSearchKeyName ,
enforcedOptions ,
signOptions
)
const baseUrlFn = ( ) => 'http://localhost:3002/api/as/v1/'
const client = new AppSearchClient ( undefined , signedSearchKey , baseUrlFn )
client . search ( 'sample-engine' , 'everglade' )
const engineName = 'my-meta-engine'
client
. createMetaEngine ( engineName , [ 'source-engine-1' , 'source-engine-2' ] )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'my-meta-engine'
client
. addMetaEngineSources ( engineName , [ 'source-engine-3' ] )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'my-meta-engine'
client
. deleteMetaEngineSources ( engineName , [ 'source-engine-3' ] )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
const engineName = 'my-meta-engine'
client
. createEngine ( engineName , {
type : 'meta' ,
source_engines : [ 'source-engine-1' , 'source-engine-2' ]
} )
. then ( response => console . log ( response ) )
. catch ( error => console . log ( error . errorMessages ) )
Nous essayons de garder ce client à jour avec tous les points de terminaison d'API disponibles depuis App Search.
Certaines API ne sont peut-être pas encore disponibles. Pour ces API, veuillez utiliser le client de bas niveau pour vous connecter et accéder à n’importe quel point de terminaison App Search.
const engineName = 'favorite-videos'
const options = {
query : 'cats'
}
const Client = require ( '@elastic/app-search-node/lib/client' )
const client = new Client ( 'private-mu75psc5egt9ppzuycnc2mc3' , 'http://localhost:3002/api/as/v1/' )
client . post ( `engines/ ${ encodeURIComponent ( engineName ) } /search` , options ) . then ( console . log )
npm test
Les spécifications de ce projet utilisent la relecture de nœuds pour capturer les appareils.
Les nouveaux appareils doivent être capturés à partir d’une instance en cours d’exécution d’App Search.
Pour capturer de nouveaux appareils, exécutez une commande comme celle-ci :
nvm use
HOST_IDENTIFIER=host-c5s2mj API_KEY=private-b94wtaoaym2ovdk5dohj3hrz REPLAY=record npm run test -- -g 'should create a meta engine'
Pour décomposer un peu ça...
HOST_IDENTIFIER
– Utilisez ceci pour remplacer la fausse valeur utilisée dans les tests par une valeur réelle valide à partir de laquelle votre instance App Search doit être enregistrée.API_KEY
- Utilisez ceci pour remplacer la fausse valeur utilisée dans les tests par une valeur réelle valide à partir de laquelle votre instance App Search doit être enregistrée.REPLAY=record
- Indique à la relecture d'enregistrer une nouvelle réponse si elle n'existe pas déjànpm run test
- Exécuter les tests-- -g 'should create a meta engine'
- Limitez les tests à exécuter UNIQUEMENT le nouveau test que vous avez créé, 'devrait créer un méta-moteur' par exempleCela créera un nouvel appareil, assurez-vous de modifier manuellement cet appareil pour remplacer l'identifiant d'hôte et la clé API enregistrés dans cet appareil par les valeurs utilisées par les tests.
Vous devrez également vous assurer que ce luminaire se trouve dans le répertoire correctement nommé sous fixtures
en fonction de l'hôte utilisé.
Vous saurez si quelque chose ne va pas, car cela générera une erreur lorsque vous exécuterez npm run test
avec une erreur telle que :
Error: POST https://host-c5s2mj.api.swiftype.com:443/api/as/v1/engines refused: not recording and no network access
Si quelque chose ne fonctionne pas comme prévu, veuillez ouvrir un problème.
Le mieux est de lire la documentation.
Vous pouvez consulter les forums de discussion de la communauté Elastic App Search.
Nous accueillons les contributeurs au projet. Avant de commencer, quelques notes...
Apache 2.0 © Élastique
Merci à tous les contributeurs !