Sintaxis básica común de Elasticsearch

De acuerdo con la información en línea, resolví la gramática básica de Elastcisearch.
Enlace de referencia:
https://blog.csdn.net/afeiqiang/article/details/83021144
https://www.itsvse.com/forum.php? mod=viewthread&tid=6334&extra=&ordertype=1
https://www.cnblogs.com/cxygg/p/9471372.html
https://blog.csdn.net/u011499747/article/details/78877922
https://www.cnblogs .com/heshun/articles/10658745.html

Operación de datos básicos

En Elasticsearch, contiene múltiples índices (Índice), cada índice correspondiente puede contener múltiples tipos (Tipo), cada uno de estos diferentes tipos puede almacenar múltiples documentos (Documento) y cada documento tiene múltiples atributos. Un índice Un índice es similar a una base de datos en una base de datos relacional tradicional y es un lugar para almacenar documentos relacionales. El plural de índice es índices o índices.

agregando datos

PUT /megacorp/employee/1
{
    
    
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}

El 1 detrás del URI representa el ID de este dato, que también puede ser una cadena. Si no desea especificar el ID usted mismo, no necesita pasarlo, pero debe usar POST para agregarlo. En este caso, Elasticsearch generará una cadena aleatoria para estos datos.

Si desea actualizar este dato, puede solicitar la URI nuevamente, la clave es especificar el ID y luego modificar el contenido json, para que este dato pueda actualizarse.

recuperar datos

Se recupera un dato específico según el ID:

GET /megacorp/employee/1

resultado:

{
    
    
    "_index": "megacorp",
    "_type": "employee",
    "_id": "1",
    "_version": 1,
    "found": true,
    "_source": {
    
    
        "first_name": "John",
        "last_name": "Smith",
        "age": 25,
        "about": "I love to go rock climbing",
        "interests": [
            "sports",
            "music"
        ]
    }
}

Entre ellos, _source es la información json que almacenamos, y otros campos son muy claros.

将HTTP动词由PUT改为GET可以用来检索文档,同样的,可以使用DELETE命令来删除文档,以及使用HEAD指令来检查文档是否存在。如果想更新已存在的文档,只需再次PUT。由此可见,Elasticsearch的作者深谙restful。

La búsqueda más fácil

GET /megacorp/employee/_search

_search es la palabra clave de es, lo que significa búsqueda de texto completo. Busque todos los documentos de tipo en el índice especificado. De manera predeterminada, solo se muestran 10 elementos por página. Puede cambiar esta configuración a través del campo de tamaño y también puede especificar el desplazamiento a través del campo desde (el valor predeterminado es desde el inicio en la posición 0). El campo tomado del resultado devuelto indica el tiempo que lleva la operación (en milisegundos), el campo timed_out indica si se agota el tiempo de espera y el campo hits indica el registro de hits.

búsqueda sencilla

Buscar datos con last_name=Smith:

GET /megacorp/employee/_search?q=last_name:Smith

búsqueda condicional

GET /megacorp/employee/_search
{
    
    
    "query" : {
    
    
        "match" : {
    
    
            "last_name" : "Smith"
        }
    }
}

Esta consulta es igual que el ejemplo anterior, pero el parámetro ha cambiado de un parámetro simple a un json complejo, pero la ventaja de la complejidad es un control más fuerte, y podemos hacer un control más detallado sobre la consulta.

búsqueda compleja

Busque por apellido y solo preocúpese por la edad > 30:

GET /megacorp/employee/_search
{
    
    
    "query" : {
    
    
        "bool": {
    
    
            "must": {
    
    
                "match" : {
    
    
                    "last_name" : "smith" 
                }
            },
            "filter": {
    
    
                "range" : {
    
    
                    "age" : {
    
     "gt" : 30 } 
                }
            }
        }
    }
}

Varias palabras clave es están involucradas aquí, explicando una por una
bool : consulta combinada, debe usarse junto con las palabras clave must , should , must_not , filter : .
debe : el campo de condición que debe coincidir
debe : habrá más de una condición bajo debería, si se cumple al menos una condición, este documento cumple con debería
debe_no : no debe coincidir
filtro : filtro

La siguiente consulta encontrará que el campo de título contiene "cómo ganar millones" y el campo "etiqueta" no está marcado como spam. Si hay una etiqueta "destacada" o una fecha de publicación anterior a 2014, estos documentos coincidentes tendrán una clasificación más alta que los sitios web similares:

{
    
     
    "bool": {
    
     
        "must":     {
    
     "match": {
    
     "title": "how to make millions" }}, 
        "must_not": {
    
     "match": {
    
     "tag":   "spam" }}, 
        "should": [ 
            {
    
     "match": {
    
     "tag": "starred" }}, 
            {
    
     "range": {
    
     "date": {
    
     "gte": "2014-01-01" }}} 
        ] 
    } 
}

rango es para encontrar documentos donde el campo especificado contiene un valor (fecha, número o cadena) dentro del rango especificado, gt significa _mayor que (_mayor que)

búsqueda de frases

GET /megacorp/employee/_search
{
    
    
    "query" : {
    
    
        "match" : {
    
    
            "about" : "rock climbing"
        }
    }
}

La búsqueda anterior devolverá datos que contengan roca o escalada, es decir, la relación predeterminada entre las palabras clave es o. ¿Qué pasa si quieres hacer coincidir esta frase exacta?

GET /megacorp/employee/_search
{
    
    
    "query" : {
    
    
        "match_phrase" : {
    
    
            "about" : "rock climbing"
        }
    }
}

Simplemente use la consulta match_phrase.

búsqueda destacada

Almacenar datos primero

PUT /_search
{
    
    
    "title":"中信泰富的并购融<em>资</em>";
    "summary":"它利用非金融性资产能源源不断地在证券市场上融资,采取发行新股和引入风险投资相结合收购恒昌企业,结果各方均取得了满意的结果。"
}

Resalte el título y los caracteres de resumen y los caracteres de la clave de consulta, el valor predeterminado es usarVen paquete.

GET /_search
{
    
    
    "query" : {
    
    
        "multi_match": {
    
     "query": "投资" }
    },
    "highlight" : {
    
    
        "fields" : {
    
    
            "title": {
    
    },
            "summary" : {
    
    }
        }
    }
}

En el resultado devuelto, cada hit tiene una parte adicional como esta:

"highlight" : {
    
    
          "summary" : [
            "它利用非金融性<em>资</em>产能源源不断地在证券市场上融<em>资</em>,采取发行新股和引入风险<em>投</em><em>资</em>相结合收购恒昌企业,结果各方均取得了满意的结果。",
            "其融<em>资</em>的方式主要有发行新股、可换股债券、引入风险<em>投</em><em>资</em>等。而这些巨额的融<em>资</em>行动是和<em>投</em><em>资</em>银行紧密充分的合作分不开的。从中得出一些对我国上市公司并购融<em>资</em>有益的启示,可作为并购融<em>资</em>实践的参考。"
          ],
          "title" : [
            "中信泰富的并购融<em>资</em>"
          ]
        }

agregación simple

Antes de la agregación, se deben realizar algunas modificaciones, ya que Elasticsearch no admite la agregación de datos de tipo texto de forma predeterminada, por lo que primero se debe habilitar :

PUT zhifou/doc/1
{
    
    
  "name":"顾老二",
  "age":30,
  "from": "gu",
  "desc": "皮肤黑、武器长、性格直",
  "tags": ["黑", "长", "直"]
}

PUT zhifou/doc/2
{
    
    
  "name":"大娘子",
  "age":18,
  "from":"sheng",
  "desc":"肤白貌美,娇憨可爱",
  "tags":["白", "富","美"]
}

PUT zhifou/doc/3
{
    
    
  "name":"龙套偏房",
  "age":22,
  "from":"gu",
  "desc":"mmp,没怎么看,不知道怎么形容",
  "tags":["造数据", "真","难"]
}


PUT zhifou/doc/4
{
    
    
  "name":"石头",
  "age":29,
  "from":"gu",
  "desc":"粗中有细,狐假虎威",
  "tags":["粗", "大","猛"]
}

PUT zhifou/doc/5
{
    
    
  "name":"魏行首",
  "age":25,
  "from":"广云台",
  "desc":"仿佛兮若轻云之蔽月,飘飘兮若流风之回雪,mmp,最后竟然没有嫁给顾老二!",
  "tags":["闭月","羞花"]
}

promedio

El requisito actual es consultar la edad promedio de las personas cuyo origen es gu.

GET zhifou/doc/_search
{
    
    
  "query": {
    
    
    "match": {
    
    
      "from": "gu"
    }
  },
  "aggs": {
    
    //表示聚合函数开始
    "my_avg": {
    
    //起的别名
      "avg": {
    
    //聚合函数类型
        "field": "age"//key与value
      }
    }
  },
  "_source": ["name", "age"]//_source表示只显示指定字段
}

Los resultados de la consulta son los siguientes

{
    
    
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    //hits表示命中多少记录
    "total" : 3,
    "max_score" : 0.6931472,
    "hits" : [
      {
    
    
        "_index" : "zhifou",
        "_type" : "doc",
        "_id" : "4",
        "_score" : 0.6931472,
        "_source" : {
    
    
          "name" : "石头",
          "age" : 29
        }
      },
      {
    
    
        "_index" : "zhifou",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
    
    
          "name" : "顾老二",
          "age" : 30
        }
      },
      {
    
    
        "_index" : "zhifou",
        "_type" : "doc",
        "_id" : "3",
        "_score" : 0.2876821,
        "_source" : {
    
    
          "name" : "龙套偏房",
          "age" : 22
        }
      }
    ]
  },
  "aggregations" : {
    
    
    "my_avg" : {
    
    
      "value" : 27.0
    }
  }
}

Aunque hemos usado _source para filtrar los campos, no es suficiente. ¿Qué debo hacer si no quiero ver los datos sino solo el valor promedio? ¡No olvides el tamaño!

GET zhifou/doc/_search
{
    
    
  "query": {
    
    
    "match": {
    
    
      "from": "gu"
    }
  },
  "aggs": {
    
    
    "my_avg": {
    
    
      "avg": {
    
    
        "field": "age"
      }
    }
  },
  "size": 0, 
  "_source": ["name", "age"]
}

Los resultados de la consulta son los siguientes

{
    
    
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : 3,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    
    
    "my_avg" : {
    
    
      "value" : 27.0
    }
  }
}

En los resultados de la consulta, vemos que el valor total de los aciertos es 3, lo que indica que hay tres datos que coinciden con el resultado. El valor promedio devuelto al final es 27.

máximo

Reemplace avg en el ejemplo anterior con max

GET zhifou/doc/_search
{
    
    
  "query": {
    
    
    "match": {
    
    
      "from": "gu"
    }
  },
  "aggs": {
    
    
    "my_max": {
    
    
      "max": {
    
    
        "field": "age"
      }
    }
  },
  "size": 0
}

Los resultados de la consulta son los siguientes

{
    
    
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : 3,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    
    
    "my_max" : {
    
    
      "value" : 30.0
    }
  }
}

min, suma

El uso es el mismo que el anterior, no en la descripción.

consulta de grupo

agrupación sencilla


Insertar datos agrupados por edad

PUT zhifou/doc/1
{
    
    
  "name":"顾老二",
  "age":25,
  "from": "gu",
  "desc": "皮肤黑、武器长、性格直",
  "tags": ["黑", "长", "直"]
}

PUT zhifou/doc/2
{
    
    
  "name":"大娘子",
  "age":18,
  "from":"sheng",
  "desc":"肤白貌美,娇憨可爱",
  "tags":["白", "富","美"]
}

PUT zhifou/doc/3
{
    
    
  "name":"龙套偏房",
  "age":22,
  "from":"gu",
  "desc":"mmp,没怎么看,不知道怎么形容",
  "tags":["造数据", "真","难"]
}


PUT zhifou/doc/4
{
    
    
  "name":"石头",
  "age":29,
  "from":"gu",
  "desc":"粗中有细,狐假虎威",
  "tags":["粗", "大","猛"]
}

PUT zhifou/doc/5
{
    
    
  "name":"魏行首",
  "age":25,
  "from":"广云台",
  "desc":"仿佛兮若轻云之蔽月,飘飘兮若流风之回雪,mmp,最后竟然没有嫁给顾老二!",
  "tags":["闭月","羞花"]
}
GET  user/student/_search
{
    
    
  "query": {
    
    
    "match_all": {
    
    }
  },
  "aggs": {
    
    
    "fz": {
    
    
      "terms": {
    
    
        "field": "age"
      }
    }
  }
  
}

resultado de búsqueda

{
    
    
  "took": 8,
  "timed_out": false,
  "_shards": {
    
    
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    
    
    "total": 5,
    "max_score": 1,
    "hits": [
      {
    
    …………},//这里省略命中结果
  "aggregations": {
    
    
    "fz": {
    
    
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
    
    
          "key": 25,
          "doc_count": 2//年龄为25的有两个记录
        },
        {
    
    
          "key": 18,
          "doc_count": 1
        },
        {
    
    
          "key": 22,
          "doc_count": 1
        },
        {
    
    
          "key": 29,
          "doc_count": 1
        }
      ]
    }
  }
}

agrupación de rango

Ahora quiero consultar el grupo de edad de todas las personas, agrupar por 15 20, 20 25, 25~30 y calcular la edad promedio de cada grupo.
Para analizar los requisitos, en primer lugar, debemos hacer los grupos primero.

GET zhifou/doc/_search
{
    
    
  "size": 0, //表示显示0条命中记录,因为我们的目标是分组结果,所以命中记录不是我们关心的,只要数量对就行了,不需要在把记录显示出来
  "query": {
    
    
    "match_all": {
    
    }
  },
  "aggs": {
    
    
    "age_group": {
    
    //别名
      "range": {
    
    
        "field": "age",//分组字段
        "ranges": [//范围
          {
    
    
            "from": 15,
            "to": 20
          },
          {
    
    
            "from": 20,
            "to": 25
          },
          {
    
    
            "from": 25,
            "to": 30
          }
        ]
      }
    }
  }
}

Los resultados de la consulta son los siguientes

{
    
    
  "took": 5,
  "timed_out": false,
  "_shards": {
    
    
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    
    
    "total": 5,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    
    
    "age_group": {
    
    
      "buckets": [
        {
    
    
          "key": "15.0-20.0",
          "from": 15,
          "to": 20,
          "doc_count": 1
        },
        {
    
    
          "key": "20.0-25.0",
          "from": 20,
          "to": 25,
          "doc_count": 1
        },
        {
    
    
          "key": "25.0-30.0",
          "from": 25,
          "to": 30,
          "doc_count": 3
        }
      ]
    }
  }
}

Luego, a continuación, necesitamos promediar la antigüedad de los datos en cada grupo.

GET zhifou/doc/_search
{
    
    
  "size": 0, 
  "query": {
    
    
    "match_all": {
    
    }
  },
  "aggs": {
    
    
    "age_group": {
    
    
      "range": {
    
    
        "field": "age",
        "ranges": [
          {
    
    
            "from": 15,
            "to": 20
          },
          {
    
    
            "from": 20,
            "to": 25
          },
          {
    
    
            "from": 25,
            "to": 30
          }
        ]
      },
      "aggs": {
    
    
        "my_avg": {
    
    
          "avg": {
    
    
            "field": "age"
          }
        }
      }
    }
  }
}

Los resultados de la consulta son los siguientes

{
    
    
  "took": 28,
  "timed_out": false,
  "_shards": {
    
    
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    
    
    "total": 5,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    
    
    "age_group": {
    
    
      "buckets": [
        {
    
    
          "key": "15.0-20.0",
          "from": 15,
          "to": 20,
          "doc_count": 1,
          "my_avg": {
    
    
            "value": 18
          }
        },
        {
    
    
          "key": "20.0-25.0",
          "from": 20,
          "to": 25,
          "doc_count": 1,
          "my_avg": {
    
    
            "value": 22
          }
        },
        {
    
    
          "key": "25.0-30.0",
          "from": 25,
          "to": 30,
          "doc_count": 3,
          "my_avg": {
    
    
            "value": 26.333333333333332
          }
        }
      ]
    }
  }
}

Nota: El uso de funciones de agregación primero debe averiguar los resultados y luego usar las funciones de agregación para procesar los resultados.

contar

GET /_count
{
    
    
    "query": {
    
    
        "match_all": {
    
    }//  "last_name" : "Smith"对指定字段计数
    }
}

Los resultados de la consulta son los siguientes

{
    
    
    "count": 12,
    "_shards": {
    
    
        "total": 20,
        "successful": 20,
        "skipped": 0,
        "failed": 0
    }
}

monitor

salud del clúster

GET _cluster/health

Supervisar un solo nodo

GET _nodes/stats

índice de estadísticas

GET my_index/_stats

GET my_index,another_index/_stats

GET _all/_stats

tareas pendientes

GET _cluster/pending_tasks

Supongo que te gusta

Origin blog.csdn.net/qq_15098623/article/details/103413188
Recomendado
Clasificación