Recherche Elasticsearch

elasticsearch recherche curl

Je vais te montrer comment faire des recherches dans le moteur de recherche Elasticsearch.

On va voir ensemble comment effectuer des :

  • recherches sur tout un index 
  • recherches sur un type
  • recherches avec plusieurs mots clés
  • recherches sur un ou plusieurs champs
  • recherches en augmentant la pondération
  • N’afficher en retour de requête que les champs souhaités

Pour la réalisation de ce cours j’utilise l’index crée dans le tuto sur l’intégration de fichier JSON dans Elasticsearch.

Pour effectuer des recherches, nous n’utiliserons que des requêtes GET.

Recherche sur tout un index Elasticsearch

Rien de plus facile pour effectuer une recherche simple, il suffit de faire une requête sur l’url de notre index en rajoutant « /_search ».

Par exemple si je souhaite faire une recherche sur le mot « MARSEILLE » l’URL sera :

http://localhost:9200/immat/_search?q=MARSEILLE

si je fais un Curl :

curl XGET http://localhost:9200/immat/_search?q=MARSEILLE | jq

(j’utilise jq pour afficher proprement le JSON de ma réponse)

je reçoit en retour toutes les données qui contiennent la chaîne de caractères MARSEILLE :

{
        "_index": "immat",
        "_type": "entreprises",
        "_id": "844",
        "_score": 5.379728,
        "_source": {
          "datasetid": "statistiques-immatriculations-en-2020",
          "recordid": "c28826e675131ef696719688b600f36c127e129c",
          "fields": {
            "mois_annee": "6/2020",
            "groupements_d_interet_economique": 0,
            "societes_commerciales_sur_achats": 31,
            "periode": "2020-06",
            "mois": 6,
            "code_region": 93,
            "libelle_departement": "BOUCHES DU RHONE",
            "greffe": "MARSEILLE",
            "region": "Provence-Alpes-Cote d'Azur",
            "societes_commerciales_sur_autres_origines": 6,
            "personnes_physiques": 432,
            "periode_mois": "2020-06-01",
            "datetmp": "2020/6",
            "societes_commerciales_sur_creation": 426,
            "code_libelle_departement": "013 - 013 - BOUCHES DU RHONE",
            "geolocalisation": [
              43.291342,
              5.374374
            ],
            "code_departement": "013",
            "annee": 2020,
            "total": 1046,
            "departement": "013 - BOUCHES DU RHONE",
            "societes_civiles": 151
          },
          "geometry": {
            "type": "Point",
            "coordinates": [
              5.374374,
              43.291342
            ]
          },
          "record_timestamp": "2020-09-02T14:35:00+02:00"
        }
      },
      {
        "_index": "immat",
        "_type": "entreprises",
        "_id": "862",
        "_score": 5.379728,
        "_source": {
          "datasetid": "statistiques-immatriculations-en-2020",
          "recordid": "858fb70c80b6fc2f7cecff4fc4cb3cd137c4ea97",
          "fields": {
            "mois_annee": "2/2020",
            "groupements_d_interet_economique": 0,
            "societes_commerciales_sur_achats": 61,
            "periode": "2020-02",
            "mois": 2,
            "code_region": 93,
            "libelle_departement": "BOUCHES DU RHONE",
            "greffe": "MARSEILLE",
            "region": "Provence-Alpes-Cote d'Azur",
            "societes_commerciales_sur_autres_origines": 6,
            "personnes_physiques": 361,
            "periode_mois": "2020-02-01",
            "datetmp": "2020/2",
            "societes_commerciales_sur_creation": 526,
            "code_libelle_departement": "013 - 013 - BOUCHES DU RHONE",
            "geolocalisation": [
              43.291342,
              5.374374
            ],
            "code_departement": "013",
            "annee": 2020,
            "total": 1147,
            "departement": "013 - BOUCHES DU RHONE",
            "societes_civiles": 193
          },
          "geometry": {
            "type": "Point",
            "coordinates": [
              5.374374,
              43.291342
            ]
          },
          "record_timestamp": "2020-09-02T14:35:00+02:00"
        }
      }

(Oui ça fait beaucoup 😅)

C’est donc toutes les données qui contiennent MARSEILLE.

Recherche sur un type Elasticsearch

C’est la même chose sauf qu’on ajoute le type dans l’url juste après l’index, par exemple la même recherche que précédemment mais sur le type entreprises :

curl XGET http://localhost:9200/immat/entreprises/_search?q=MARSEILLE

Recherches avec plusieurs mots clés

Pour l’instant j’ai effectué des recherches sur un seul mot clé MARSEILLE.

Si l’on veut effecteur une recherche sur plusieurs mots clés il suffit de rajouter + mot clé, exemple :

curl XGET http://localhost:9200/immat/_search?q=MARSEILLE+PARIS

Recherches sur un champs

Pour effectuer une recherche sur un champs en particulier on ajoute dans l’URL, le champs=motclés, par exemple :

http://localhost:9200/immat/entreprises/_search?q=personnes_physiques=7

Cette requête affiche les données d’entreprises de 7 salariés.

Recherches sur un ou plusieurs champs

Pour l’instant nous n’avons effectuer que des recherches via l’URL, maintenant on va voir comment faire une recherche en intégrant un JSON contenant les indications de recherche.

Je crée donc mon fichier JSON :

{
    "query": {
      "multi_match" : {
        "query":    "BREST+034",
        "fields": [ "*code_departement", "*greffe" ] 
      }
    }
  }

Ce fichier indique que l’on va rechercher les mots clés « BREST » et « 034 » sur les champs « greffe » et « code_departement ».

Nous aurons donc en retour les données d’entreprises de Brest et du département de l’Hérault (034).

Pour effectuer une recherche via notre fichier JSON voici la commande curl à exécuter :

curl -H "Content-Type: application/json" -XGET http://localhost:9200/_search --data-binary @fichier.json

on envoi une requête sur « http://localhost:9200/_search » puis on insert le fichier JSON avec « –data-binary @fichier.json ».

Recherches en augmentant la pondération

La pondération est l’importance d’un champs sur les autres dans une recherches sur plusieurs champs.

Par exemple, si je souhaite faire une recherche sur 034 et MARSEILLE en augmentant l’importance du champs code_departement voici à quoi ressemble le fichier JSON (ici j’augmente la pondération par 3 « code_departement^3 »):

{
    "query": {
        "multi_match" : {
            "query" : "034+MARSEILLE",
            "fields" : ["*code_departement^3", "*greffe"]
        }
    }
}

La réponse de retour affichera alors en priorité les données qui match avec le champs code_departement.

N’afficher en retour de requête que les champs souhaités

Les retours JSON peuvent être compliqués à lire (voir très moche 🤮 ) si l’index contient beaucoup de champs. Pour palier a ce problème on peut ajouter, dans notre fichier JSON un indicateur « _source » avec les champs souhaités.

Par exemple si je ne veux afficher seulement les champs « code_departement », « greffe », « societes_civiles » et « personnes_physiques » :

    "_source" : ["*code_departement", "*greffe","*societes_civiles", "*personnes_physiques"]

Le fichier JSON en totalité :

{
    "query": {
        "multi_match" : {
            "query" : "059+BASTIA",
            "fields" : ["*code_departement^3", "*greffe"]
        }
    },
    "_source" : ["*code_departement", "*greffe","*societes_civiles", "*personnes_physiques"]
}

Le retour sera beaucoup plus propre 😎 :

{
        "_index": "immat",
        "_type": "entreprises",
        "_id": "256",
        "_score": 10.554211,
        "_source": {
          "fields": {
            "societes_civiles": 22,
            "greffe": "DUNKERQUE",
            "code_departement": "059",
            "personnes_physiques": 53
          }
        }
      },
      {
        "_index": "immat",
        "_type": "entreprises",
        "_id": "278",
        "_score": 10.554211,
        "_source": {
          "fields": {
            "societes_civiles": 26,
            "greffe": "DOUAI",
            "code_departement": "059",
            "personnes_physiques": 33
          }
        }
      },
      {
        "_index": "immat",
        "_type": "entreprises",
        "_id": "388",
        "_score": 10.554211,
        "_source": {
          "fields": {
            "societes_civiles": 175,
            "greffe": "LILLE METROPOLE",
            "code_departement": "059",
            "personnes_physiques": 253
          }
        }
      }
    ]
  }
}

Voila mon pote, maintenant tu sais comment rechercher avec l’API Elasticsearch.

Si tu veux en savoir un peu plus sur les possibilités de recherche voici la doc officielle.

Laisser un commentaire