TP : Définir et exécuter des requêtes de recherche dans Elasticsearch

Description

Savoir comment collecter, analyser, enrichir et indexer des données dans Elasticsearch est important, mais savoir comment poser des questions précises sur les données est encore plus crucial. Après tout, vous ne pouvez pas épeler “Elasticsearch” sans “recherche” ! Que vous utilisiez Elasticsearch pour la recherche de sites, la recherche de produits, l’analyse opérationnelle ou la veille stratégique, savoir formuler des requêtes de recherche complexes est essentiel pour tirer de la valeur de toutes ces données que vous avez réussi à collecter, analyser, enrichir et indexer. Dans ce laboratoire pratique, vous allez effectuer les tâches suivantes :

  • Rechercher un terme spécifique dans un champ
  • Appliquer un filtre de recherche pour réduire l’ensemble de données recherchables
  • Trier les données résultantes
  • Mettre en évidence le terme recherché dans les résultats
  • Paginer les résultats de la recherche

Vous travaillez en tant que consultant Elasticsearch et avez été engagé par une université locale qui cherche à mettre en œuvre Elasticsearch pour la recherche littéraire. L’équipe avec laquelle vous travaillez crée une interface utilisateur qui permettra aux étudiants d’effectuer des analyses de recherche sur diverses œuvres littéraires. La configuration de test avec laquelle vous travaillez est un cluster Elasticsearch à 6 nœuds chargé des œuvres complètes de Shakespeare. Pour que l’interface utilisateur affiche les résultats de recherche souhaités, vous devez aider l’équipe à proposer deux requêtes de recherche qui répondent aux exigences.

Préparation

PUT /shakespeare
{
 "mappings": {
   "properties": {
    "speaker": {"type": "keyword"},
    "play_name": {"type": "keyword"},
    "line_id": {"type": "integer"},
    "speech_number": {"type": "integer"}
   }
 }
}


curl -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json
curl -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/shakespeare/doc/_bulk?pretty' --data-binary @shakespeare_6.0.json


GET _cat/nodes?v

GET _cat/indices?v

Créer une requête de recherche qui répond aux exigences de la requête 1

Requête 1 :

  • Le type du document doit être une “scène”.
  • Le champ text_entry doit contenir une forme du mot “london”.
  • La pièce doit être parmi “Henry VI Part 1”, “Henry VI Part 2”, ou “Henry VI Part 3”.
  • La taille du tableau des résultats doit être égale au nombre de résultats.
  • Les résultats sont d’abord triés par nom de la pièce dans l’ordre croissant, puis par numéro de ligne dans l’ordre croissant.
GET shakespeare/_search
{
  "size": 20,
  "sort": [
    {
      "play_name": {
        "order": "asc"
      }
    },
    {
      "line_id": {
        "order": "asc"
      }
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "type.keyword": {
              "value": "scene"
            }
          }
        },
        {
          "match": {
            "text_entry": "london"
          }
        }
      ],
      "should": [
        {
          "term": {
            "play_name": {
              "value": "Henry VI Part 1"
            }
          }
        },
        {
          "term": {
            "play_name": {
              "value": "Henry VI Part 2"
            }
          }
        },
        {
          "term": {
            "play_name": {
              "value": "Henry VI Part 3"
            }
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

Créer une requête de recherche qui répond aux exigences de la requête 2

Requête 2 :

  • Le champ text_entry doit contenir une forme du mot “death”.
  • Un filtre réduit l’ensemble des données recherchées à la pièce de théâtre “Hamlet”.
  • Les résultats sont d’abord triés par leur score de pertinence dans l’ordre décroissant, puis par le line_id dans l’ordre croissant.
  • La recherche prend en charge la pagination et renvoie les 5 premiers documents.
  • Les résultats de la recherche mettent en évidence le terme correspondant avec search_term.
GET shakespeare/_search
{
  "from": 0,
  "size": 5,
  "highlight": {
    "pre_tags": ["<strong>"],
    "post_tags": ["</strong>"],
    "fields": {
      "text_entry": {}
    }
  },
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    },
    {
      "line_id": {
        "order": "asc"
      }
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "text_entry": "death"
          }
        }
      ],
      "filter": {
        "term": {
          "play_name": "Hamlet"
        }
      }
    }
  }
}