Elasticsearch7.6 notas de estudio 1 Introducción a Elasticsearch
Prólogo
La guía autorizada en chino es solo 2.x, pero ahora ha alcanzado 7.6. Instale lo último para aprender.
Instalar
Aquí está la instalación de aprendizaje, la instalación de producción es otro conjunto de lógica.
ganar
es dirección de descarga:
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.0-windows-x86_64.zip
Dirección de descarga de Kibana:
https://artifacts.elastic.co/downloads/kibana/kibana-7.6.0-windows-x86_64.zip
La última versión oficial actual es 7.6.0, pero la velocidad de descarga es terrible. El uso de la velocidad de descarga de Thunder puede alcanzar xM.
bin\elasticsearch.bat
bin\kibana.bat
Haz doble clic en bat para comenzar.
instalación de estibador
Para las pruebas y el aprendizaje, es más rápido y más conveniente usar directamente la imagen oficial del acoplador.
Consulte el método de instalación: https://www.cnblogs.com/woshimrf/p/docker-es7.html
Lo siguiente es de:
https://www.elastic.co/guide/en/elasticsearch/reference/7.6/getting-started.html
Indexar algunos documentos
Esta prueba utiliza kibana directamente, por supuesto, también puede visitar localhost: 9200 a través de curl o cartero.
Visite localhost: 5601 y luego haga clic en Herramientas de desarrollo.
Crear un nuevo índice de clientes (índice)
PUT / {index-name} / _ doc / {id}
PUT /customer/_doc/1
{
"name": "John Doe"
}
put
Es http método, si no existe un índice (index) ES en customer
, crear un e insertar un dato, id
a ,
name = John`.
Si no se actualiza. Tenga en cuenta que las actualizaciones se actualizan cobertura que es lo JSON cuerpo, el resultado final es Que.
El regreso es el siguiente:
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 7,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 6,
"_primary_term" : 1
}
_index
Es el nombre del índice_type
Solo para_doc
_id
Es la clave principal del documento, que es el paquete de un registro_version
Es la_id
cantidad de actualizaciones, he actualizado 7 veces aquí_shards
Representa el resultado de la fragmentación. Hemos implementado un total de dos nodos aquí, y ambos se han escrito con éxito.
Puede verificar el estado del índice en la administración de índice en kibana. Por ejemplo, nuestro registro tiene dos fragmentos principales y dos.
Una vez que el registro se haya guardado correctamente, se puede leer de inmediato:
GET /customer/_doc/1
Volver
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 15,
"_seq_no" : 14,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "John Doe"
}
}
_source
Es lo que grabamos
Inserto a granel
Cuando hay que insertar varios datos, podemos insertarlos en lotes. Descargue los documentos preparados y luego importe a través de la solicitud HTTP.
Cree un banco de índice: dado que los fragmentos (fragmentos) y las réplicas (réplicas) no se pueden modificar después de crearlos, configure los fragmentos al crearlos primero. Hay 3 fragmentos y 2 réplicas.
PUT /bank
{
"settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "2"
}
}
}
Dirección del documento: https://gitee.com/mirrors/elasticsearch/raw/master/docs/src/test/resources/accounts.json
Después de la descarga, el comando curl o el cartero envía una solicitud de archivo
curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@accounts.json"
curl "localhost:9200/_cat/indices?v"
El formato de cada registro es el siguiente:
{
"_index": "bank",
"_type": "_doc",
"_id": "1",
"_version": 1,
"_score": 0,
"_source": {
"account_number": 1,
"balance": 39225,
"firstname": "Amber",
"lastname": "Duke",
"age": 32,
"gender": "M",
"address": "880 Holmes Lane",
"employer": "Pyrami",
"email": "[email protected]",
"city": "Brogan",
"state": "IL"
}
}
Seleccione self monitor en kibana monitor y luego busque el banco de índices en índices. Puede ver la distribución de los datos que importamos.
Como puede ver, hay 3 fragmentos en diferentes nodos, y hay 2 réplicas.
Iniciar consulta
Después de insertar algunos datos en lotes, podemos comenzar a aprender a consultar. Como sabemos anteriormente, los datos son la tabla de empleados del banco. Consultamos a todos los usuarios y los clasificamos de acuerdo con los números de cuenta.
Similar a sql
select * from bank order by account_number asc limit 3
Consulta DSL
GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
],
"size": 3,
"from": 2
}
_search
Consulta expresaquery
Es la condición de consulta, aquí están todossize
Representa el número de cada consulta, el número de páginas. Si no se transmite, el valor predeterminado es 10.hits
Se muestra en los resultados devueltos .from
Indica desde qué número
Devoluciones:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1000,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "2",
"_score" : null,
"_source" : {
"account_number" : 2,
"balance" : 28838,
"firstname" : "Roberta",
"lastname" : "Bender",
"age" : 22,
"gender" : "F",
"address" : "560 Kingsway Place",
"employer" : "Chillium",
"email" : "[email protected]",
"city" : "Bennett",
"state" : "LA"
},
"sort" : [
2
]
},
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "3",
"_score" : null,
"_source" : {
"account_number" : 3,
"balance" : 44947,
"firstname" : "Levine",
"lastname" : "Burks",
"age" : 26,
"gender" : "F",
"address" : "328 Wilson Avenue",
"employer" : "Amtap",
"email" : "[email protected]",
"city" : "Cochranville",
"state" : "HI"
},
"sort" : [
3
]
},
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "4",
"_score" : null,
"_source" : {
"account_number" : 4,
"balance" : 27658,
"firstname" : "Rodriquez",
"lastname" : "Flores",
"age" : 31,
"gender" : "F",
"address" : "986 Wyckoff Avenue",
"employer" : "Tourmania",
"email" : "[email protected]",
"city" : "Eastvale",
"state" : "HI"
},
"sort" : [
4
]
}
]
}
}
El resultado devuelto proporciona la siguiente información
took
es tiempo de consulta, la unidad es milisegundostimed_out
si la búsqueda ha expirado_shards
Cuánto hemos buscado, cuánto hemosshards
tenido éxito, cuánto hemos fallado, cuánto hemos omitido. Acerca del fragmento, simplemente se entiende como fragmentación de datos, es decir, los datos en un índice se dividen en varias partes, que se pueden entender como división de tabla por id.max_score
Puntuación del documento más relevante
A continuación, puede intentar una consulta condicional.
Búsqueda de palabras
Consulta la dirección con mill
suma lane
en dirección.
GET /bank/_search
{
"query": { "match": { "address": "mill lane" } },
"size": 2
}
Volver
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 19,
"relation" : "eq"
},
"max_score" : 9.507477,
"hits" : [
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "136",
"_score" : 9.507477,
"_source" : {
"account_number" : 136,
"balance" : 45801,
"firstname" : "Winnie",
"lastname" : "Holland",
"age" : 38,
"gender" : "M",
"address" : "198 Mill Lane",
"employer" : "Neteria",
"email" : "[email protected]",
"city" : "Urie",
"state" : "IL"
}
},
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "970",
"_score" : 5.4032025,
"_source" : {
"account_number" : 970,
"balance" : 19648,
"firstname" : "Forbes",
"lastname" : "Wallace",
"age" : 28,
"gender" : "M",
"address" : "990 Mill Road",
"employer" : "Pheast",
"email" : "[email protected]",
"city" : "Lopezo",
"state" : "AK"
}
}
]
}
}
- Me puse a devolver 2, pero en realidad llegué a 19
Consulta de coincidencia exacta
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}
En este momento, solo hay uno que coincide exactamente.
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 9.507477,
"hits" : [
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "136",
"_score" : 9.507477,
"_source" : {
"account_number" : 136,
"balance" : 45801,
"firstname" : "Winnie",
"lastname" : "Holland",
"age" : 38,
"gender" : "M",
"address" : "198 Mill Lane",
"employer" : "Neteria",
"email" : "[email protected]",
"city" : "Urie",
"state" : "IL"
}
}
]
}
}
Consulta de múltiples condiciones
En la consulta real, generalmente se consultan varias condiciones juntas
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}
bool
Se usa para combinar múltiples condiciones de consultamust
,should
,must_not
Es una consulta booleana subsentenciamust
,should
determinar la relevancia puntuación, la puntuación de acuerdo con el resultado de la ordenación por defectomust not
Se utiliza como filtro para afectar los resultados de la consulta, pero no afecta la puntuación, sino que solo filtra los resultados.
También puede especificar cualquier filtro explícitamente para incluir o excluir documentos basados en datos estructurados.
Por ejemplo, consulte el saldo entre 20,000 y 30,000.
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
Grupo de operaciones agregadas por
Estadísticas por provincia
De acuerdo con la redacción de SQL, puede ser
select state AS group_by_state, count(*) from tbl_bank limit 3;
La solicitud correspondiente a es es
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword",
"size": 3
}
}
}
}
size=0
Es limitar el contenido devuelto, ya que es devolverá los registros de la consulta, solo queremos agregar valoresaggs
Es una palabra gramatical agregadagroup_by_state
Es un resultado de agregación, el nombre está personalizadoterms
Los campos de la consulta coinciden exactamente, aquí están los campos que deben agruparsestate.keyword
el estado es untext
tipo, el tipo de caracteres necesita estadísticas y agrupación, el tipo debe ser una palabra clavesize=3
Limite el número devuelto por el grupo, aquí está top3, top10 predeterminado, el máximo del sistema es 10000, se puede lograr mediante modificaciónsearch.max_buckets
, tenga en cuenta que múltiples fragmentos producirán problemas de precisión y luego aprenderá en profundidad más adelante
Valor de retorno:
{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1000,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"group_by_state" : {
"doc_count_error_upper_bound" : 26,
"sum_other_doc_count" : 928,
"buckets" : [
{
"key" : "MD",
"doc_count" : 28
},
{
"key" : "ID",
"doc_count" : 23
},
{
"key" : "TX",
"doc_count" : 21
}
]
}
}
}
hits
Haga clic en el registro de la condición de consulta, ya que size = 0 está establecido, regresa[]
.total
Esta consulta alcanzó 1000 registrosaggregations
Es el resultado del indicador agregadogroup_by_state
Es el nombre de la variable nombrado en nuestra consultadoc_count_error_upper_bound
No hay ningún resultado de agregación potencial devuelto en esta agregación, pero puede haber un resultado de agregación potencial. El nombre de la clave significa "límite superior", lo que significa que el valor del resultado final no se calcula en el peor de los casos estimados, por supuesto, el valor de doc_count_error_upper_bound Cuanto mayor sea el valor, mayor será la posibilidad de que los datos finales sean inexactos. Lo que se puede determinar es que su valor es 0, lo que indica que los datos son completamente correctos, pero no es 0, lo que no significa que los datos agregados sean incorrectos.sum_other_doc_count
El número de documentos que no se contaron en la agregación
Vale la pena señalar que top3 es exacto. Vemos doc_count_error_upper_bound
que hay un número incorrecto, es decir, el resultado estadístico es probable que sea inexacto, y el top3 obtenido es 28, 23, 21. Agregaremos otro parámetro de consulta para comparar El resultado:
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword",
"size": 3,
"shard_size": 60
}
}
}
}
-----------------------------------------
"aggregations" : {
"group_by_state" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 915,
"buckets" : [
{
"key" : "TX",
"doc_count" : 30
},
{
"key" : "MD",
"doc_count" : 28
},
{
"key" : "ID",
"doc_count" : 27
}
]
}
}
shard_size
Representa el número de cálculos para cada fragmento. Debido a que la operación de agregación agg calcula un resultado para cada fragmento, y luego agrega el resultado final. Los datos se distribuyen de manera desigual en los fragmentos, y la parte superior N de cada fragmento no es el mismo, solo Es posible que el resultado de agregación final sea un poco menor. Por lo tanto, no esdoc_count_error_upper_bound
0. Elshard_size
valor predeterminado de es essize*1.5+10
que size = 3 corresponde a 14.5, verificando que el valor de retorno cuando shar_size = 14.5 es de hecho el mismo que no pasa. Cuando se establece en 60, el error es finalmente Es 0, es decir, se puede garantizar que estos 3 son definitivamente los más importantes 3. Es decir, la operación de agregación debería establecer shard_size lo más grande posible, como 20 veces el tamaño.
Cuente la cantidad de personas por provincia y calcule el salario promedio
Queremos verificar el salario promedio de cada provincia, sql puede ser
select
state, avg(balance) AS average_balance, count(*) AS group_by_state
from tbl_bank
group by state
limit 3
Puede consultar en es así:
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword",
"size": 3,
"shard_size": 60
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
},
"sum_balance": {
"sum": {
"field": "balance"
}
}
}
}
}
}
- El segundo
aggs
es calcular el índice de agregación de cada estado average_balance
Nombre de la variable personalizada, el valor es laavg
operación de equilibrio del mismo estadosum_balance
Nombre de la variable personalizada, el valor es lasum
operación de equilibrio del mismo estado
El resultado es el siguiente:
{
"took" : 12,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1000,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"group_by_state" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 915,
"buckets" : [
{
"key" : "TX",
"doc_count" : 30,
"sum_balance" : {
"value" : 782199.0
},
"average_balance" : {
"value" : 26073.3
}
},
{
"key" : "MD",
"doc_count" : 28,
"sum_balance" : {
"value" : 732523.0
},
"average_balance" : {
"value" : 26161.535714285714
}
},
{
"key" : "ID",
"doc_count" : 27,
"sum_balance" : {
"value" : 657957.0
},
"average_balance" : {
"value" : 24368.777777777777
}
}
]
}
}
}
Estadísticas por provincia y ordenadas por salario promedio
El orden predeterminado de los términos agg es el recuento descendente, si queremos usar otros métodos, SQL puede ser así:
select
state, avg(balance) AS average_balance, count(*) AS group_by_state
from tbl_bank
group by state
order by average_balance
limit 3
Los es correspondientes pueden consultarse así:
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword",
"order": {
"average_balance": "desc"
},
"size": 3
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
El resultado devuelto top3 no es el anterior:
"aggregations" : {
"group_by_state" : {
"doc_count_error_upper_bound" : -1,
"sum_other_doc_count" : 983,
"buckets" : [
{
"key" : "DE",
"doc_count" : 2,
"average_balance" : {
"value" : 39040.5
}
},
{
"key" : "RI",
"doc_count" : 5,
"average_balance" : {
"value" : 36035.4
}
},
{
"key" : "NE",
"doc_count" : 10,
"average_balance" : {
"value" : 35648.8
}
}
]
}
}
Referencia
- Comunidad china: https://elasticsearch.cn/
- es documentación oficial: https://www.elastic.co/guide/en/elasticsearch/reference/current/documents-indices.html
- es documento oficial: https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-index.html
- El cálculo de la agregación de términos es inexacto: https://www.dongwm.com/post/elasticsearch-terms-agg-is-not-accurate/