Elastic Search Core Technology (Ⅱ): Introduction à Elastic Search

JamesShangguan 2021-08-19 23:36:23 阅读数:709

elastic search core technology introduction

Dans cet article, les concepts de base 、BasicCRUDFonctionnement、 Principe de l'Index inversé 、 Segmentation des mots Elasticsearch.

2.1 Concepts de base

Elasticsearch Est orienté vers le document (Document)De, Le document est la plus petite Unit é de toutes les données consultables ; Les documents sont séquencés JsonFormat,Enregistrer dansElasticsearchMoyenne, Et chaque document a un ID,Peut passerElasticsearchGénération automatique, Vous pouvez également le spécifier vous - même .ComparerMySQL, Chaque ligne de données a une clé primaire , Cette clé primaire peut être utilisée MySQLClé primaire auto - incrémentale, Il peut également être généré par l'algorithme flocon de neige et configuré par lui - même. .

Métadonnées du document , Informations sur le dimensionnement des documents .Par exemple:_index Indique le nom de l'index auquel appartient le document ,_id Indique que le document est unique ID,_score Indique le score de corrélation ,_source Est l'original du document Json Données, etc. .

Index(Index) Est le conteneur du document , Est une collection de documents .ComparerMySQL, L'index peut être considéré comme une table de données .

Mapping Utilisé pour définir les noms et les types de champs ,ComparerMySQL, Chaque tableau a une définition de la structure du tableau , Inclure le nom du champ , Type de champ, etc. . Analogie avec une base de données relationnelle :

RDBMS Elasticsearch
Table Index
Row Document
Column Field
Schema Mapping
SQL DSL

NoeudC'est unElasticsearchExemples,Est essentiellement unJavaProcessus.Plusieurs peuvent fonctionner sur une seule machineElasticsearchProcessus, Mais l'environnement de production recommande généralement qu'une machine fonctionne avec une valeur ElasticsearchExemple. Les noeuds sont divisés en noeuds de données et en noeuds de coordination . Le noeud de données est le noeud où les données sont sauvegardées , Le noeud de coordination est responsable de la réception ClientDemandes, Acheminer la demande vers le noeud approprié , Et rassembler les résultats .

Cluster Est composé de plusieurs noeuds .

Fractionnement Partition primaire et copie , Un certain nombre de copies peuvent être définies pour chaque tranche . La partition principale est utilisée pour résoudre le problème de l'extension horizontale des données , Les données peuvent être distribuées à tous les noeuds du cluster via le segment principal . Les répliques sont utilisées pour résoudre les problèmes de disponibilité élevée des données , La copie est une copie du fragment principal , Le nombre de fragments de répliques peut être ajusté dynamiquement ,Augmenter le nombre de copies, Peut améliorer la disponibilité des services dans une certaine mesure . Bien sûr, la copie peut fournir une fonction de requête , Répartition de la charge de lecture du système . Par exemple, dans l'image suivante , Le nombre de tranches est 3, Le nombre d'exemplaires est 1.

Pour le réglage des tranches , La mise en place de segments dans l'environnement de production doit être planifiée à l'avance. . Si le nombre de tranches est trop petit, l'extension horizontale du noeud ne peut pas être augmentée ultérieurement. ; Et la quantité de données individuelles est trop grande , Cela peut prendre du temps à redistribuer les données . Réglage excessif du nombre de tranches , Score de corrélation qui affecte les résultats de la recherche , Influence sur l'exactitude des résultats statistiques ; Et il y a trop de morceaux sur un seul noeud , Risque de gaspillage de ressources , Affecte également le rendement .

2.2 BasicCRUD Opérations et opérations par lots

ElasticsearchDisponible à l'extérieurRESTful APIPourCRUD.UtiliserRESTful APIAvecElasticsearch Il y a deux façons d'interagir :curl Ligne de commande et Kibana DevTools.Peut être utilisé directementKibana DevToolAvecElasticsearchPour interagir.

2.2.1 Opérations d'indexation

  1. Créer un index
    request: PUT /test_index
    response:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "test_index"
}
  1. Afficher les index existants
    request:GET _cat/indices
    response:green open test_index GRXXECvrQjuNKRog7aDkPQ 1 1 2 3 28.9kb 14.4kb

  2. Supprimer l'index
    request:DELETE /test_index
    response:

{
"acknowledged" : true
}

2.2.2 Fonctionnement du document

  1. Désignationid Créer un document

request:

PUT /test_index/_doc/1
{
"username":"Paul",
"age":10
}

response:

{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
  1. Ne pas spécifierid Créer un document

request:

POST /test_index/_doc
{
"username":"Rose",
"age":11
}

response:

{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "soOv1HcB4Isa6tvVdQ9J",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
  1. Désignationid Recherche de documents

request:GET /test_index/_doc/1

response:

{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"username" : "Paul",
"age" : 10
}
}
  1. Interroger tous les documents

request:GET /test_index/_search

response:

{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"username" : "Paul",
"age" : 10
}
},
{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "soOv1HcB4Isa6tvVdQ9J",
"_score" : 1.0,
"_source" : {
"username" : "Rose",
"age" : 11
}
}
]
}
}
  1. Mettre à jour le document

request:

POST /test_index/_update/1
{
"doc": {
"username": "Paul",
"age": 20
}
}

response:

{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 1
}
  1. Supprimer le document

request:DELETE /test_index/_doc1

2.2.3 Opérations par lots

Les opérations par lots peuvent réduire les frais généraux liés à la connexion au réseau ,Amélioration des performances.

  • _bulk

Soutien en une seule fois API Appel en cours , Travailler sur différents Index .

bulkSoutienIndex、Create、Update?Delete Quatre opérations .

Une seule opération dans la demande a échoué , N'affecte pas les autres opérations , Renvoie le résultat de chaque action dans le résultat .

request:

POST _bulk
{"index":{"_index":"test_index", "_id":"1"}}
{"username":"Smart", "age":22}
{"delete":{"_index":"test_index", "_id":"2"}}

response:

{
"took" : 95,
"errors" : false,
"items" : [
{
"index" : {
"_index" : "test_index",
"_type" : "_doc",
"_id" : "1",
"_version" : 5,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 5,
"_primary_term" : 1,
"status" : 200
}
},
{
"delete" : {
"_index" : "test_index",
"_type" : "_doc",
"_id" : "2",
"_version" : 1,
"result" : "not_found",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 6,
"_primary_term" : 1,
"status" : 404
}
}
]
}
  • Lecture par lots mget

request:

GET _mget
{
"docs":[
{
"_index":"test_index",
"_id":1
},
{
"_index":"movies",
"_id":1
}]
}

response:

{
"docs" : [
{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"_seq_no" : 2,
"_primary_term" : 1,
"found" : true,
"_source" : {
"username" : "Paul",
"age" : 20
}
},
{
"_index" : "movies",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 6,
"_primary_term" : 1,
"found" : true,
"_source" : {
"id" : "1",
"title" : "Toy Story",
"year" : 1995,
"genre" : [
"Adventure",
"Animation",
"Children",
"Comedy",
"Fantasy"
],
"@version" : "1"
}
}
]
}
  • Requête par lots msearch

request:

POST test_index/_msearch
{}
{"query":{"match_all":{}},"size":1}
{"index":"kibana_sample_data_flights"}
{"query":{"match_all":{}},"size":2}

response:

{
"took" : 4,
"responses" : [
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "soOv1HcB4Isa6tvVdQ9J",
"_score" : 1.0,
"_source" : {
"username" : "Rose",
"age" : 11
}
}
]
},
"status" : 200
},
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 10000,
"relation" : "gte"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "kibana_sample_data_flights",
"_type" : "_doc",
"_id" : "iTmvUXcBNxIYppLoFWwg",
"_score" : 1.0,
"_source" : {
"FlightNum" : "R3J7URU",
"DestCountry" : "US",
"OriginWeather" : "Hail",
"OriginCityName" : "Moscow",
"AvgTicketPrice" : 1172.5681640799792,
"DistanceMiles" : 5149.888524287689,
"FlightDelay" : false,
"DestWeather" : "Rain",
"Dest" : "Spokane International Airport",
"FlightDelayType" : "No Delay",
"OriginCountry" : "RU",
"dayOfWeek" : 6,
"DistanceKilometers" : 8287.942197231247,
"timestamp" : "2021-02-14T10:59:03",
"DestLocation" : {
"lat" : "47.61989975",
"lon" : "-117.5339966"
},
"DestAirportID" : "GEG",
"Carrier" : "ES-Air",
"Cancelled" : false,
"FlightTimeMin" : 753.4492906573861,
"Origin" : "Sheremetyevo International Airport",
"OriginLocation" : {
"lat" : "55.972599",
"lon" : "37.4146"
},
"DestRegion" : "US-WA",
"OriginAirportID" : "SVO",
"OriginRegion" : "RU-MOS",
"DestCityName" : "Spokane",
"FlightTimeHour" : 12.557488177623101,
"FlightDelayMin" : 0
}
},
{
"_index" : "kibana_sample_data_flights",
"_type" : "_doc",
"_id" : "ijmvUXcBNxIYppLoFWwg",
"_score" : 1.0,
"_source" : {
"FlightNum" : "OE9TTXI",
"DestCountry" : "GB",
"OriginWeather" : "Sunny",
"OriginCityName" : "Guangzhou",
"AvgTicketPrice" : 834.6361636829536,
"DistanceMiles" : 5911.063226254684,
"FlightDelay" : false,
"DestWeather" : "Thunder & Lightning",
"Dest" : "London Heathrow Airport",
"FlightDelayType" : "No Delay",
"OriginCountry" : "CN",
"dayOfWeek" : 6,
"DistanceKilometers" : 9512.93413679362,
"timestamp" : "2021-02-14T08:13:00",
"DestLocation" : {
"lat" : "51.4706",
"lon" : "-0.461941"
},
"DestAirportID" : "LHR",
"Carrier" : "JetBeats",
"Cancelled" : true,
"FlightTimeMin" : 500.68074404176946,
"Origin" : "Guangzhou Baiyun International Airport",
"OriginLocation" : {
"lat" : "23.39240074",
"lon" : "113.2990036"
},
"DestRegion" : "GB-ENG",
"OriginAirportID" : "CAN",
"OriginRegion" : "SE-BD",
"DestCityName" : "London",
"FlightTimeHour" : 8.344679067362824,
"FlightDelayMin" : 0
}
}
]
},
"status" : 200
}
]
}

2.3 Index inversé

2.3.1 Index positif et Index inversé

Qu'est - ce qu'un index positif ? L'indexation positive fait référence à l'indexation à partir d'un document Id Au contenu du document 、 Pertinence des mots . Par exemple, un catalogue de chaque livre , La Table des matières vous permet de trouver rapidement le contenu spécifique d'un titre sur la page du livre. .

Qu'est - ce qu'un index inversé ? Index inversé du contenu du document ou des mots au document Id Relation entre . Ou un exemple de livre , L'Index inversé fait référence à l'index du contenu spécifique au titre de l'article. .

Quelqu'un a donné un exemple d'image. . Un poème, par exemple. , Donnez le nom d'un poème , D'habitude, tout le monde peut Mémoriser le contenu du poème. .Alors pourquoi?“ Fleur volante ” On ne se souvient pas des versets. ? Parce qu'il n'y a pas d'index inversé dans notre cerveau d'un mot d'un poème à un nom de poème. , Si un tel Index inversé est établi, , On peut voler comme des joueurs de la Conférence de poésie chinoise. .

DocumentationID Contenu du document
1 Elasticsearch Est le moteur de recherche le plus populaire
2 Java Est la meilleure langue du monde
3 Google Est le plus grand moteur de recherche au monde
Les mots DocumentationIDListe
elasticsearch 1
Populaire 1
Moteur de recherche 1,3
java 2
Le monde 2
Mieux vaut 2
Langues 2
google 3
Global 3
Max. 3

Elasticsearch Ce qui est stocké est un jsonFormat du document, Contient plusieurs champs , Chaque champ a son propre Index inversé .

Comment l'Index inversé est - il généré? ? Est le contenu du document Participant Après et documentation IDAssocier.

2.4 Participant

La segmentation des mots fait référence à la segmentation des chaînes successives en mots selon certaines règles. (term or token)Processus,InES Ça s'appelle à l'intérieur. Analysis.

2.4.1 ES Composition du diviseur de mots et du diviseur de mots

Analyzer- Oui.ES Composants spécialisés dans la segmentation des mots , La composition est la suivante: :

  • Character Filters: Traitement du texte original , Comme enlever HTML Identificateurs spéciaux, etc.
  • Tokenizer: Diviser le texte original en mots selon certaines règles
  • Token Filters:PourTokenizer Les mots traités sont retravaillés , En minuscules, par exemple. 、 Suppression de mots désactivés ou ajout de synonymes, etc.

Le processus de travail est illustré dans la figure. :

Elasticsearch Diviseur de mots intégré

Diviseur de mots Description
Standard Analyzer Diviseur de mots par défaut , Segmentation par mot , Traitement des minuscules , Désactiver la fermeture par défaut du traitement de texte
Simple Analyzer Diviser par non - Lettre , Les non - alphabets sont supprimés , Traitement des minuscules
Stop Analyzer Traitement des minuscules , Désactiver le filtrage des mots
Whitespace Analyzer Diviser par espace , Pas de minuscules
Keyword Analyzer - Non. , Sortie directe de l'entrée
Pattern Analyzer Expression régulière,Par défaut\W+( Segmentation des symboles non alphanumériques )
Language Offre30 Diviseur de mots dans plusieurs langues communes
Customer Analyzer Diviseur de mots personnalisé

Testez:

  • Désignation directe AnalyzerEffectuer des tests
GET /_analyze
{
"analyzer": "standard",
"text": [
"Hello World, Hello Elasticsearch"
]
}
  • Spécifier les champs de l'index à tester
POST /movies/_analyze
{
"field": "title",
"text": [
"Hello World, Hello Elasticsearch"
]
}
  • Test du diviseur de mots personnalisé
POST /_analyze
{
"tokenizer": "standard",
"filter": [
"lowercase"
],
"text": [
"Hello World, Hello Elasticsearch"
]
}

2.4.2 Analyze APIUtiliser

ES Fournir un test APIInterface, Vérifier facilement l'effet de segmentation des mots ._analyze

Peut être spécifié directement analyzerEffectuer des tests

Vous pouvez spécifier directement les champs de l'index à tester :GET test_index/_analyze

Le diviseur de mots peut être personnalisé pour le test

Jusqu'ici., J'ai appris les bases. APIUtilisation de、Opérations par lots、 Principe de l'Index inversé et concept de segmentation des mots ,C'est exact.ELasticsearch Avec une compréhension préliminaire .

Copyright:Cet article est[JamesShangguan]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2021/08/20210819233432519F.html