Actuellement chez Allo-Media, nous utilisons Elasticsearch dans son flux de travail général, qui consiste à créer un index et à stocker des documents contenant les métadonnées des transcriptions audio des appels téléphoniques, puis à permettre de rechercher à travers ces documents en fonction de certains critères commerciaux tels que : « Donnez-moi tous les appels téléphoniques du client Acme, où le client parle de la grève en France ».
La fonctionnalité de percolateur d’Elasticsearch permet de faire une recherche inversée. Nous stockons les requêtes de recherche sous forme de documents dans leur propre index, puis nous pouvons faire percoler de nouveaux documents d’appel et récupérer les requêtes de recherche correspondantes. Un cas d’utilisation pour utiliser le percolateur est la classification des documents.
Par exemple, supposons que nous voulions étiqueter avec « Chèque envoyé » tous les documents mentionnant que l’utilisateur a déjà envoyé un chèque bancaire. Nous aurions la requête de recherche suivante :
("J'ai envoyé" | "J'ai déjà envoyé") ("chèque")
Donc d’abord, nous devons créer un index pour stocker les requêtes de recherche avec le mappage suivant :
PUT /search-perco<br>{<br>"mappings": {<br>"_doc": {<br>"properties": {<br>"tag_uuid": {<br>"type": "text"<br>},<br>"tag_name": {<br>"type": "text"<br>},<br>"content": {<br>"type": "text"<br>},<br>"query": {<br>"type": "percolator"<br>}<br>}<br>}<br>}<br>}
- Les champs tag_* sont utilisés pour la classification des documents.
- Le champ query de type percolator est utilisé pour indexer les documents de la requête de recherche, en stockant un DSL de requête en JSON.
- Le champ contenu est utilisé pour prétraiter les documents percolés.
Une fois l’index créé, nous pouvons maintenant stocker nos documents de requête de recherche, comme celui-ci :
PUT /search-perco/_doc/1?refresh<br>{<br>"query": {<br>"bool": {<br>"must": [<br>{<br>"simple_query_string": {<br>"query": "("J'ai envoyé" | "J'ai déjà envoyé") ("chèque")",<br>"fields": [<br>"content"<br>],<br>"default_operator": "and"<br>}<br>}<br>]<br>}<br>},<br>"tag_uuid": "2f86ad85-4c09-4ef3-bb6e-100d129018e9",<br>"tag_name": "Chèque envoyé"<br>}
Et si nous recherchons dans cet index, nous récupérerons notre document de requête de recherche nouvellement ajouté :
GET search-perco/_search<br>{<br>"query": {"match_all": {}}<br>}
Maintenant, il est temps de faire percoler les documents d’appel via la requête de percolation :
GET /search-perco/_search
{
"_source": [
"tag_uuid",
"tag_name"
],
"query": {
"percolate": {
"field": "query",
"documents": [{
"unique_id": "2f86ad85-4c09-4ef3-bb6e-100d129018e7",
"timestamp": "2018-01-02T18:13:30+00:00",
"duration": 322,
"transcribed": true,
"client_name": "Acme",
"content": "J'ai déjà envoyé un chèque la semaine dernière…"
}]
}
},
"highlight": {
"fields": {
"content": {}
}
}
}
Elasticsearch fournit la réponse suivante :
{<br>"took": 37,<br>"timed_out": false,<br>"_shards": {<br>"total": 5,<br>"successful": 5,<br>"skipped": 0,<br>"failed": 0<br>},<br>"hits": {<br>"total": 1,<br>"max_score": 0.8630463,<br>"hits": [<br>{<br>"_index": "search-perco",<br>"_type": "_doc",<br>"_id": "1",<br>"_score": 0.8630463,<br>"_source": {<br>"tag_name": "Chèque envoyé",<br>"tag_uuid": "2f86ad85-4c09-4ef3-bb6e-100d129018e9"<br>},<br>"fields": {<br>"_percolator_document_slot": [<br>0<br>]<br>},<br>"highlight": {<br>"content": [<br>"<em>J'ai déjà envoyé</em> un chèque la semaine dernière…"<br>]<br>}<br>}<br>]<br>}<br>}
Donc ici, nous voyons que notre document d’appel correspond à la requête de recherche étiquetée « Chèque envoyé ». Nous pouvons utiliser le surligneur pour mettre en évidence les termes qui ont correspondu aux documents de requête de recherche. Le champ « _percolator_document_slot » est utile lorsque nous envoyons plusieurs documents au champ « documents » de la requête de percolation. Et « max_score » et « _score » vous donnent le score de pertinence des documents correspondants. Vous pouvez désactiver le calcul du score lors de l’utilisation de la requête de percolation en utilisant un contexte de filtre.
Nous pouvons également faire percoler des documents existants en fournissant l’index où ils sont stockés et leurs identifiants :
GET /search-perco/_search<br>{<br>"query" : {<br>"percolate" : {<br>"field": "query",<br>"index" : "call-index",<br>"id" : "2"<br>}<br>}<br>}
Vous devriez vous soucier d’optimiser l’analyse de texte lors du temps de percolation comme suggéré par la documentation Optimisation du percolateur.
Documentation Elasticsearch: