3. Sintaxis de búsqueda principal de ElasticSearch

Tabla de contenido

1. Operaciones por lotes de documentos

1. _mget (obtener datos del documento en lotes)

(1) No especifique el índice ni el tipo en la URL
Método de solicitud: OBTENER
dirección de solicitud: _mget
Descripción de la función: Obtenga datos sin índice (biblioteca de índice) y tipo (tabla) a través de id
Parámetros de solicitud:

"docs":[
        {
    
    
            "_index":"索引库名称",
            "_type":"类型默认是_doc",
            "_id":主键
        }, #多个条件使用逗号分割
        {
    
    
        .............
		}
    ]

_type es el valor predeterminado después de la versión es7.x, y no se recomienda utilizar la consulta _type (si su versión es 7 o superior, no puede agregarla)

Ejemplo de declaración ES:
我是查询的两个索引库(test_index01,test_index02)

GET _mget
{
    
    
    "docs":[
        {
    
    
            "_index":"test_index01",
            "_id":1
        },
        {
    
    
            "_index":"test_index02",
            "_id":1
        }
    ]
}

resultado

{
    
    
  "docs" : [
    {
    
    
      "_index" : "test_index01",
      "_type" : "_doc",
      "_id" : "1",
      "_version" : 1,
      "_seq_no" : 3,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
    
    
        "name" : "秀儿",
        "sex" : 1,
        "age" : 25,
        "address" : "上海",
        "remark" : "java"
      }
    },
    {
    
    
      "_index" : "test_index02",
      "_type" : "_doc",
      "_id" : "1",
      "_version" : 3,
      "_seq_no" : 2,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
    
    
        "name" : "李四",
        "sex" : 1,
        "age" : 28,
        "address" : "北京",
        "remark" : "java"
      }
    }
  ]
}

(2) Especifique el método de solicitud de índice en la URL
: GET
dirección de solicitud: GET / nombre de la biblioteca de índice / _mget
descripción de la función: consulta el contenido de la biblioteca de índice especificada en lotes
Parámetros de solicitud:

GET /索引库名称/_mget
{
    
    
    "docs":[
        {
    
    
            "_id":主键id
        },
        {
    
    
            "_id":主键id
        }
    ]
}

Ejemplo

GET /test_index01/_mget
{
    
    
    "docs":[
        {
    
    
            "_id":1
        },
        {
    
    
            "_id":2
        }
    ]
}

resultado

{
    
    
  "docs" : [
    {
    
    
      "_index" : "test_index01",
      "_type" : "_doc",
      "_id" : "1",
      "_version" : 1,
      "_seq_no" : 3,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
    
    
        "name" : "秀儿",
        "sex" : 1,
        "age" : 25,
        "address" : "上海",
        "remark" : "java"
      }
    },
    {
    
    
      "_index" : "test_index01",
      "_type" : "_doc",
      "_id" : "2",
      "found" : false
    }
  ]
}

2. _bulk (crear datos de documentos en lotes)

Los métodos de venta y publicación se analizaron en el artículo anterior. Aquí puede realizar los dos métodos usted mismo para ver la diferencia. Lo siguiente se explicará en la publicación.

(1) Cree documentos en lotes.
No especifique el índice ni el tipo en la URL.
Método de solicitud: dirección de solicitud POST
: _bulk
Descripción de la función: agregar, eliminar y modificar datos del documento.
Parámetros de solicitud:
generalmente, hay dos líneas de parámetros ( o muchos pares de parámetros)
La primera línea: Especifica el tipo de operación (adición, eliminación, modificación) y el objeto de la operación (índice, tipo, id)
La segunda línea: los datos de la operación

1 {
    
    "actionName":{
    
    "_index":"indexName", "_type":"typeName","_id":"id"}}
2 {
    
    "field1":"value1", "field2":"value2"}
POST _bulk
{
    
    "操作类型(create,index,delete,update)":{
    
    "_index":"索引库名称", "_type":"类型(7.x以后版本可省略)", "_id":指定主键}}
{
    
    "title":"文档数据具体内容","content":"文档数据具体内容","tags":["文档数据具体内容", "文档数据具体内容"]}

Ejemplo:
El id:3 aquí es el ID de la empresa, no la clave principal de es. La clave principal de es es _id:9así

POST _bulk
{
    
    "create":{
    
    "_index":"test_index03", "_id":9}}
{
    
    "id":3,"title":"1","content":"111","tags":["java", "面向对象"]}
{
    
    "create":{
    
    "_index":"test_index03","_id":810}}
{
    
    "id":4,"title":"2","content":"222","tags":["java", "面向对象"]}

resultado

{
    
    
  "took" : 3,
  "errors" : false,
  "items" : [
    {
    
    
      "create" : {
    
    
        "_index" : "test_index03",
        "_type" : "_doc",
        "_id" : "9",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
    
    
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 12,
        "_primary_term" : 1,
        "status" : 201
      }
    },
    {
    
    
      "create" : {
    
    
        "_index" : "test_index03",
        "_type" : "_doc",
        "_id" : "810",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
    
    
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 13,
        "_primary_term" : 1,
        "status" : 201
      }
    }
  ]
}

(2) Normalmente crea o reemplaza el índice.
Si el documento original no existe, créalo
. Si existe, modifica el documento original en su totalidad
. Ejemplo

 POST _bulk
 {
    
    "index":{
    
    "_index":"article", "_id":99}}
 {
    
    "title":"1","content":"2222","tags":["333", "444"]}

resultado

{
    
    
  "took" : 5,
  "errors" : false,
  "items" : [
    {
    
    
      "index" : {
    
    
        "_index" : "article",
        "_type" : "_doc",
        "_id" : "99",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
    
    
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 2,
        "_primary_term" : 1,
        "status" : 201
      }
    }
  ]
}

Cuando se ejecuta nuevamente, el resultado se convierte en "resultado": "actualizado"

{
    
    
  "took" : 2,
  "errors" : false,
  "items" : [
    {
    
    
      "index" : {
    
    
        "_index" : "article",
        "_type" : "_doc",
        "_id" : "99",
        "_version" : 2,
        "result" : "updated",
        "_shards" : {
    
    
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 3,
        "_primary_term" : 1,
        "status" : 200
      }
    }
  ]
}

3. _bulk (Eliminar datos del documento en lotes)

No especifique el índice ni escriba en la URL
. Método de solicitud: Dirección de solicitud POST
: _bulk
Descripción de la función: Eliminar el contenido del documento de la biblioteca de índices en lotes.
Parámetros de solicitud:

 POST _bulk
 {
    
    "delete":{
    
    "_index":"索引库名称", "_id":es主键}}

Ejemplo

 POST _bulk
 {
    
    "delete":{
    
    "_index":"test_index03", "_id":3}}
 {
    
    "delete":{
    
    "_index":"test_index03", "_id":4}}

resultado

{
    
    
  "took" : 3,
  "errors" : false,
  "items" : [
    {
    
    
      "delete" : {
    
    
        "_index" : "test_index03",
        "_type" : "_doc",
        "_id" : "3",
        "_version" : 7,
        "result" : "deleted",
        "_shards" : {
    
    
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 14,
        "_primary_term" : 1,
        "status" : 200
      }
    },
    {
    
    
      "delete" : {
    
    
        "_index" : "test_index03",
        "_type" : "_doc",
        "_id" : "4",
        "_version" : 7,
        "result" : "deleted",
        "_shards" : {
    
    
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 15,
        "_primary_term" : 1,
        "status" : 200
      }
    }
  ]
}

4. _bulk (modificar los datos del documento en lotes)

No especifique el índice ni el tipo en la URL
Método de solicitud: Dirección de solicitud POST
: _bulk
Descripción de la función: Modificar datos del documento en lotes
Parámetros de solicitud:

 POST _bulk
 {
    
    "update":{
    
    "_index":"索引库名称", "_id":es主键}}
 {
    
    "doc":{
    
    "更新的字段名称":"更新内容"}}

Ejemplo

 POST _bulk
 {
    
    "update":{
    
    "_index":"test_index03", "_id":3}}
 {
    
    "doc":{
    
    "title":"ES"}}
 {
    
    "update":{
    
    "_index":"test_index03",  "_id":4}}
 {
    
    "doc":{
    
    "content":"修改内容"}}

Resultado (lo eliminé antes y lo modifiqué después de agregarlo)

{
    
    
  "took" : 35,
  "errors" : false,
  "items" : [
    {
    
    
      "update" : {
    
    
        "_index" : "test_index03",
        "_type" : "_doc",
        "_id" : "3",
        "_version" : 3,
        "result" : "updated",
        "_shards" : {
    
    
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 20,
        "_primary_term" : 1,
        "status" : 200
      }
    },
    {
    
    
      "update" : {
    
    
        "_index" : "test_index03",
        "_type" : "_doc",
        "_id" : "4",
        "_version" : 3,
        "result" : "updated",
        "_shards" : {
    
    
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 21,
        "_primary_term" : 1,
        "status" : 200
      }
    }
  ]
}

2. Consulta avanzada en lenguaje DSL

1. Información general

Lenguaje específico de dominio
Elasticsearch proporciona un DSL basado en JSON para definir consultas.
DSL consta de dos cláusulas: cláusula de consulta hoja y cláusula de consulta compuesta.
Insertar descripción de la imagen aquí

2. Sin condiciones de consulta

Consulta incondicional, consulta todo de forma predeterminada

GET /test_index03/_doc/_search
{
    
    
    "query":{
    
    
        "match_all":{
    
    
        }
    }
}

3. Hay condiciones de consulta.

3.1 Consulta de condición de hoja (condición de consulta de un solo campo)

(1) consulta difusa

La concordancia difusa es principalmente para campos de tipo texto. Los campos de tipo texto segmentarán el contenido del texto. Al realizar una consulta, el contenido pasado por las condiciones que usted consulta también se segmentará y luego los datos coincidentes se encontrarán a través del índice invertido. La concordancia difusa es Implementado principalmente a través de parámetros como la coincidencia. .

①match: contenido de condición de coincidencia aproximada a través de palabra clave de coincidencia
②prefix: coincidencia de prefijo
③regexp: coincidencia de datos a través de expresiones regulares
match的复杂用法

  1. La condición de coincidencia también admite los siguientes parámetros:
  2. consulta: especifica el valor coincidente
  3. operador: tipo de condición de coincidencia
    • y: todas las condiciones deben coincidir después de la segmentación de palabras
    • o: solo hay una coincidencia después del participio condicional (predeterminado)
  4. minmum_should_match: especifica el número mínimo de coincidencias

(2) coincidencia exacta

  1. término: la única condición es igual
  2. términos: un solo campo pertenece a un valor dentro de una matriz de valores
  3. rango: El campo pertenece a un rango de valores
  4. existe: si el valor de un determinado campo existe
  5. ids: consulta por lotes por ID

3.2 Consulta de condiciones combinadas (consulta de múltiples condiciones)

La consulta condicional combinada es una condición de consulta completa formada combinando declaraciones de consulta condicionales de hoja.

  1. bool: Existe una relación y, o no, entre las condiciones
    • debe: Cada condición debe cumplirse, es decir, cada condición está relacionada y
    • debería: solo se cumple una de cada condición, es decir, cada condición está en una relación OR
    • must_not: No se cumplen todas las condiciones, es decir, no se cumplen todas las condiciones.
    • filtro: no calcula la puntuación de relevancia, no calcula el _score, que es la puntuación de relevancia, y es más eficiente.
  2. Constant_score: No calcula la puntuación de relevancia

must/filter/shoud/must_notLa subcondición de igual se pasa
term/terms/range/ids/exists/matchcomo parámetro mediante la condición de hoja igual.

3.3 Consulta de conexión (consulta de combinación de varios documentos)

  1. Consulta de documento padre-hijo: padre/hijo
  2. Consulta de documento anidado: anidado

3.4 Diferencia entre consulta DSL (consulta DSL) y filtro DSL (filtro DSL)

Hay dos tipos de lenguajes de consulta DSL: consulta y filtro.
Insertar descripción de la imagen aquí

Cuarto ejemplo de consulta

4.1 consulta de términos

term查询不会对字段进行分词查询, utilizará una coincidencia exacta

Utilice el término para consultas precisas y el tipo de asignación del campo de consulta es palabra clave (consulte el catálogo para obtener información relacionada con la asignación)

Contenido del índice

GET /test_index02/_search
{
    
    
    "query":{
    
    
        "match_all":{
    
    
        }
    }
}

resultado

{
    
    
  "took" : 1,
  "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_index02",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
    
    
          "name" : "秀儿",
          "sex" : 1,
          "age" : 25,
          "address" : "上海",
          "remark" : "java"
        }
      },
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "C9bd_IYBuSAClcwx8fGZ",
        "_score" : 1.0,
        "_source" : {
    
    
          "name" : "李四",
          "sex" : 1,
          "age" : 28,
          "address" : "北京",
          "remark" : "java"
        }
      }
    ]
  }
}

Ejemplo 1

POST /test_index02/_search
{
    
    
    "query":{
    
    
        "term":{
    
    
            "age":"28"
        }
    }
}

resultado

{
    
    
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
    
    
          "name" : "李四",
          "sex" : 1,
          "age" : 28,
          "address" : "北京",
          "remark" : "java"
        }
      }
    ]
  }
}

示例2

POST /test_index02/_search
{
    
    
    "query":{
    
    
        "term":{
    
    
            "name":"秀儿"
        }
    }
}

resultado

{
    
    
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

示例3

POST /test_index02/_search
{
    
    
    "query":{
    
    
        "term":{
    
    
            "name.keyword":"秀儿"
        }
    }
}

resultado

{
    
    
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.6931471,
    "hits" : [
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.6931471,
        "_source" : {
    
    
          "name" : "秀儿",
          "sex" : 1,
          "age" : 25,
          "address" : "上海",
          "remark" : "java"
        }
      }
    ]
  }
}

4.2consulta difusa coincidente

match会根据该字段的分词器,进行分词查询

Ejemplo

POST /test_index02/_search
{
    
    
    "from":0,
    "size":2,
    "query":{
    
    
        "match":{
    
    
            "name":"秀儿"
        }
    }
}

resultado

{
    
    
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.3862942,
    "hits" : [
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.3862942,
        "_source" : {
    
    
          "name" : "秀儿",
          "sex" : 1,
          "age" : 25,
          "address" : "上海",
          "remark" : "java"
        }
      }
    ]
  }
}

4.3 consulta de coincidencia aproximada de múltiples campos multi_match y consulta de campo especificado

Aquí hay solo una demostración simple, usted mismo debe comprender los métodos más detallados.

Indexar todos los datos

"hits" : [
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
    
    
          "name" : "秀儿",
          "sex" : 1,
          "age" : 25,
          "address" : "上海",
          "remark" : "java"
        }
      },
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "DNbg_IYBuSAClcwx4fEv",
        "_score" : 1.0,
        "_source" : {
    
    
          "name" : "李四",
          "sex" : 1,
          "age" : 28,
          "address" : "北京",
          "remark" : "java"
        }
      },
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "Ddbm_IYBuSAClcwxbfER",
        "_score" : 1.0,
        "_source" : {
    
    
          "name" : "王五",
          "sex" : 1,
          "age" : 28,
          "address" : "北京",
          "remark" : "秀儿多字段"
        }
      },
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "Dtbv_IYBuSAClcwx5fFw",
        "_score" : 1.0,
        "_source" : {
    
    
          "name" : "赵六",
          "sex" : 1,
          "age" : 28,
          "address" : "秀儿",
          "remark" : "python"
        }
      }
    ]

Ejemplo (especificar campos)

POST /test_index02/_search
{
    
    
    "query":{
    
    
        "multi_match":{
    
    
            "query":"秀儿",
            "fields":[
                "remark",
                "name"
            ]
        }
    }
}

resultado

{
    
    
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.9616582,
    "hits" : [
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.9616582,
        "_source" : {
    
    
          "name" : "秀儿",
          "sex" : 1,
          "age" : 25,
          "address" : "上海",
          "remark" : "java"
        }
      },
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "Ddbm_IYBuSAClcwxbfER",
        "_score" : 1.3921447,
        "_source" : {
    
    
          "name" : "王五",
          "sex" : 1,
          "age" : 28,
          "address" : "北京",
          "remark" : "秀儿多字段"
        }
      }
    ]
  }
}

Ejemplo 2

POST /test_index02/_search
{
    
    
    "query":{
    
    
        "multi_match":{
    
    
            "query":"秀儿"
        }
    }
}

resultado

{
    
    
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 2.4079456,
    "hits" : [
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 2.4079456,
        "_source" : {
    
    
          "name" : "秀儿",
          "sex" : 1,
          "age" : 25,
          "address" : "上海",
          "remark" : "java"
        }
      },
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "Dtbv_IYBuSAClcwx5fFw",
        "_score" : 1.9333868,
        "_source" : {
    
    
          "name" : "赵六",
          "sex" : 1,
          "age" : 28,
          "address" : "秀儿",
          "remark" : "python"
        }
      },
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "Ddbm_IYBuSAClcwxbfER",
        "_score" : 1.5779729,
        "_source" : {
    
    
          "name" : "王五",
          "sex" : 1,
          "age" : 28,
          "address" : "北京",
          "remark" : "秀儿多字段"
        }
      }
    ]
  }
}

Ejemplo 3 (campos que utilizan comodines)

POST /test_index02/_search
{
    
    
    "query":{
    
    
        "multi_match":{
    
    
            "query":"秀儿",
            "fields":[
                "address",
                "na*"
            ]
        }
    }
}

resultado

{
    
    
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 2.4079456,
    "hits" : [
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 2.4079456,
        "_source" : {
    
    
          "name" : "秀儿",
          "sex" : 1,
          "age" : 25,
          "address" : "上海",
          "remark" : "java"
        }
      },
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "Dtbv_IYBuSAClcwx5fFw",
        "_score" : 1.9333868,
        "_source" : {
    
    
          "name" : "赵六",
          "sex" : 1,
          "age" : 28,
          "address" : "秀儿",
          "remark" : "python"
        }
      }
    ]
  }
}

4.4query_string Campo no especificado y consulta de condición de campo especificada, incluidas las condiciones Y y O

AND 和 OR 需要大写
Ejemplo no especificado

POST /test_index02/_search
{
    
    
    "query":{
    
    
        "query_string":{
    
    
            "query":"王五 OR 李四"
        }
    }
}

resultado

{
    
    
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 2.4079456,
    "hits" : [
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "DNbg_IYBuSAClcwx4fEv",
        "_score" : 2.4079456,
        "_source" : {
    
    
          "name" : "李四",
          "sex" : 1,
          "age" : 28,
          "address" : "北京",
          "remark" : "java"
        }
      },
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "Ddbm_IYBuSAClcwxbfER",
        "_score" : 2.4079456,
        "_source" : {
    
    
          "name" : "王五",
          "sex" : 1,
          "age" : 28,
          "address" : "北京",
          "remark" : "秀儿多字段"
        }
      }
    ]
  }
}

Ejemplo no especificado

POST /test_index02/_search
{
    
    
    "query":{
    
    
        "query_string":{
    
    
            "query":"王五 AND 秀儿"
        }
    }
}

resultado

{
    
    
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 3.9859185,
    "hits" : [
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "Ddbm_IYBuSAClcwxbfER",
        "_score" : 3.9859185,
        "_source" : {
    
    
          "name" : "王五",
          "sex" : 1,
          "age" : 28,
          "address" : "北京",
          "remark" : "秀儿多字段"
        }
      }
    ]
  }
}

Ejemplo de un campo específico (se utilizan comodines en el campo na*, aquí solo coincide un campo de nombre)

POST /test_index02/_search
{
    
    
    "query":{
    
    
        "query_string":{
    
    
            "query":"王五 OR 张三",
            "fields":[
                "address",
                "na*"
            ]
        }
    }
}

resultado

{
    
    
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 2.4079456,
    "hits" : [
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "Ddbm_IYBuSAClcwxbfER",
        "_score" : 2.4079456,
        "_source" : {
    
    
          "name" : "王五",
          "sex" : 1,
          "age" : 28,
          "address" : "北京",
          "remark" : "秀儿多字段"
        }
      }
    ]
  }
}

4.5 consulta de rango de rango

gte es mayor o igual que, lte es menor o igual que, gt es mayor que, lt es menor que.

Ejemplo

POST /test_index02/_search
{
    
    
    "query":{
    
    
        "range":{
    
    
            "age":{
    
    
                "gte":25,
                "lte":26
            }
        }
    }
}

resultado

{
    
    
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
    
    
          "name" : "秀儿",
          "sex" : 1,
          "age" : 25,
          "address" : "上海",
          "remark" : "java"
        }
      }
    ]
  }
}

4.6 Paginación, generación de campos específicos y clasificación de consultas por campos

Ejemplo

POST /test_index02/_search
{
    
    
    "query":{
    
    
        "range":{
    
    
            "age":{
    
    
                "gte":25,
                "lte":28
            }
        }
    },
    "from":0,
    "size":2,
    "_source":[
        "name",
        "age"
    ],
    "sort":{
    
    
        "age":"desc",
        "sex":"desc"
    }
}

resultado

{
    
    
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "DNbg_IYBuSAClcwx4fEv",
        "_score" : null,
        "_source" : {
    
    
          "name" : "李四",
          "age" : 28
        },
        "sort" : [
          28,
          1
        ]
      },
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "Ddbm_IYBuSAClcwxbfER",
        "_score" : null,
        "_source" : {
    
    
          "name" : "王五",
          "age" : 28
        },
        "sort" : [
          28,
          1
        ]
      }
    ]
  }
}

5.Ejemplo de consulta de filtro

Filter的查询不会计算相关性分值,也不会对结果进行排序, 因此效率会高一点,查询的结果可以被缓存

Ejemplo

POST /test_index02/_search
{
    
    
    "query":{
    
    
        "bool":{
    
    
            "filter":{
    
    
                "term":{
    
    
                    "age":25
                }
            }
        }
    }
}

resultado

{
    
    
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.0,
    "hits" : [
      {
    
    
        "_index" : "test_index02",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.0,
        "_source" : {
    
    
          "name" : "秀儿",
          "sex" : 1,
          "age" : 25,
          "address" : "上海",
          "remark" : "java"
        }
      }
    ]
  }
}

6.match、term、match_phase、query_string总结

Segmentación de palabras en inglés: divida palabras individuales exitosas según espacios

Tomemos como ejemplo hola julio
, si la granularidad más fina de la segmentación de palabras es: hola julio. Hay un ejemplo de esto en el primer blog (proceso de segmentación de palabras).

  1. Para una coincidencia
    aproximada, debe especificar el nombre del campo, pero el contenido de la consulta de entrada estará segmentado por palabras. Por ejemplo, la consulta "hola julio" primero se segmentará por palabras, se dividirá en dos partes hola y julio, y luego buscará la base de datos de índice correspondiente de acuerdo con las reglas del contenido de índice invertido. Si el campo contiene hola o julio, o hola julio, se consultará.
  2. término
    A veces, los resultados de la consulta de término y coincidencia son los mismos. Por ejemplo, si término consulta la palabra julio, el resultado será el mismo que el de coincidencia. La consulta de término no segmentará el contenido, lo que significa que julio no dividirse en partes más finas de palabras. Al consultar julio con coincidencia, aunque la coincidencia segmentará el contenido de la consulta, julio ya es la segmentación más detallada, luego julio se usa para consultas de índice invertido, por lo que los resultados de las dos consultas son los mismos.
    Pero si el término consulta hola julio es diferente, hola julio se usará como un todo para la consulta de índice invertido y no estará segmentado por palabras, mientras que la coincidencia será segmentada por palabras, por lo que los resultados de la consulta no serán los mismos.
  3. match_phase
    match_phase también segmentará el contenido de la consulta, pero el resultado también debe contener todas las palabras segmentadas y el orden debe ser el mismo. Tomando la consulta "hola julio" como ejemplo, el resultado debe contener hola y julio, y deben ser consecutivos. Al aparecer juntos, el orden también es fijo. Se puede entender que "hola julio" es una consulta difusa para la granularidad más fina. Y "hola de julio" no aparecerá en los resultados si el pedido es incorrecto y no se cumplen las condiciones de la consulta.
  4. query_string
    es similar a match, pero match necesita especificar el nombre del campo, mientras que query_string busca en todos los campos.

3. Mapeo de documentos

El mapeo de ElasticSearch se divide en dos tipos de mapeo dinámico y mapeo estático.

1.Mapeo dinámico

En una base de datos relacional (como mysql), primero debe crear una base de datos y una tabla de datos, luego definir campos, tipos de campos, etc., y finalmente configurarlos antes de insertar datos en esta tabla. En ElasticSearch, no es necesario definir asignaciones (tablas, campos, tipos en mysql, etc.). Cuando se escribe un documento en ElasticSearch, el tipo se identificará automáticamente en función de los campos del documento. Este mecanismo se denomina asignación dinámica.

Las reglas de mapeo dinámico son las siguientes:

datos json tipo de mapa automático
nulo no se agregaron campos
verdadero o falso tipo booleano
decimal tipo flotante
número tipo largo
fecha fecha o texto
cadena tipo de texto
formación Determinado por el primer valor no nulo de la matriz
objeto json tipo de objeto

2. Mapeo estático

En ElasticSearch, también puede definir asignaciones por adelantado, incluido cada tipo de campo del documento, segmentador de palabras, etc. Este método es una asignación estática. ( 设置完的字段映射关系,是不支持修改的)

3. Obtener mapeo de documentos

Preguntar

GET /test_index02/_mapping

resultado

{
    
    
  "test_index02" : {
    
    
    "mappings" : {
    
    
      "properties" : {
    
    
        "address" : {
    
    
          "type" : "text",
          "fields" : {
    
    
            "keyword" : {
    
    
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "age" : {
    
    
          "type" : "long"
        },
        "name" : {
    
    
          "type" : "text",
          "fields" : {
    
    
            "keyword" : {
    
    
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "remark" : {
    
    
          "type" : "text",
          "fields" : {
    
    
            "keyword" : {
    
    
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "sex" : {
    
    
          "type" : "long"
        }
      }
    }
  }
}

Establecer mapeo estático
"index":true: si se debe realizar una indexación de segmentación de palabras en este campo
"store":true: si se deben guardar los datos originales en este campo

PUT /test_index05
{
    
    
    "mappings":{
    
    
        "properties":{
    
    
            "name":{
    
    
                "type":"keyword",
                "index":true,
                "store":true
            },
            "sex":{
    
    
                "type":"integer",
                "index":true,
                "store":true
            },
            "age":{
    
    
                "type":"integer",
                "index":true,
                "store":true
            },
            "address":{
    
    
                "type":"text",
                "index":true,
                "store":true
            },
            "remark":{
    
    
                "type":"text",
                "index":true,
                "store":true
            }
        }
    }
}

Preguntar

GET /test_index05/_mapping

resultado

{
    
    
  "test_index05" : {
    
    
    "mappings" : {
    
    
      "properties" : {
    
    
        "address" : {
    
    
          "type" : "text",
          "store" : true
        },
        "age" : {
    
    
          "type" : "integer",
          "store" : true
        },
        "name" : {
    
    
          "type" : "keyword",
          "store" : true
        },
        "remark" : {
    
    
          "type" : "text",
          "store" : true
        },
        "sex" : {
    
    
          "type" : "integer",
          "store" : true
        }
      }
    }
  }
}

4. Tipos de núcleos

  1. Cadena: cadena, el tipo de cadena incluye texto y palabra clave.
  • texto: este tipo se utiliza para indexar textos largos. Antes de crear el índice, estos textos se segmentarán en combinaciones de palabras e indexados; es puede recuperar estas palabras y el tipo de texto no se puede utilizar para ordenar y agregar.
  • palabra clave: este tipo no se puede segmentar y se puede utilizar para recuperación, filtrado, clasificación y agregación. El tipo de palabra clave no se puede utilizar para recuperación difusa de segmentación de palabras. (Es decir, si guarda un dato como "hola julio", si es de tipo texto, se segmentará y almacenará en el índice, mientras que la palabra clave almacenará directamente hola julio como un todo en el índice sin terrible.)
  1. Tipo numérico: largo, entero, corto, byte, doble, flotante
  2. Tipo de fecha: fecha
  3. Tipo booleano: booleano

5. La diferencia entre los tipos de mapeo de texto y palabras clave

El nombre del tipo de asignación de índice
ahora es palabra clave ( 只能精准查询, 不能分词查询,能聚合、排序)

    "mappings" : {
    
    
      "properties" : {
    
    
        "address" : {
    
    
          "type" : "text",
          "store" : true
        },
        "age" : {
    
    
          "type" : "integer",
          "store" : true
        },
        "name" : {
    
    
          "type" : "keyword",
          "store" : true
        },
        "remark" : {
    
    
          "type" : "text",
          "store" : true
        },
        "sex" : {
    
    
          "type" : "integer",
          "store" : true
        }
      }
    }
  }
}

Indexar todos los datos

    "hits" : [
      {
    
    
        "_index" : "test_index05",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
    
    
          "name" : "天王盖地虎",
          "sex" : 1,
          "age" : 25,
          "address" : "上海",
          "remark" : "java"
        }
      }
    ]

consulta de términos

POST /test_index05/_search
{
    
    
    "query":{
    
    
        "term":{
    
    
            "name":"天王盖地虎"
        }
    }
}

resultado

{
    
    
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
    
    
        "_index" : "test_index05",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
    
    
          "name" : "天王盖地虎",
          "sex" : 1,
          "age" : 25,
          "address" : "上海",
          "remark" : "java"
        }
      }
    ]
  }
}

consulta de coincidencia

POST /test_index05/_search
{
    
    
    "query":{
    
    
        "match":{
    
    
            "name":"地虎"
        }
    }
}

resultado

{
    
    
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

这里需要注意一点:当name的type为keyword类型时,使用match进行搜索时,如果搜索内容和存贮内容完全一致,是可以搜到结果的。明明match会分词,为啥有能搜到呢?这个问题有些困扰到我。于是多方了解有了答案
Por favor lea atentamente lo siguiente

① Cuando se utiliza el tipo de consulta de concordancia en ElasticSearch como datos de tipo de palabra clave, la consulta de concordancia exacta se realizará directamente sin operación de segmentación de palabras.
②Cuando se utiliza la coincidencia para consultar datos de tipo texto, el analizador estándar se utilizará de forma predeterminada para la segmentación de palabras y la cadena de consulta se segmentará antes de realizar la consulta.
③El tokenizador estándar segmentará la cadena de consulta según separadores como espacios y signos de puntuación, convertirá las palabras a minúsculas y eliminará las palabras vacías comunes (como a, an, the, etc.). Después de la segmentación de palabras, ElasticSearch consultará cada palabra segmentada en la cadena de consulta en el índice invertido y devolverá los documentos coincidentes.
Si necesita utilizar otros separadores de palabras para la consulta, puede especificar los separadores de palabras correspondientes en la consulta de coincidencia.

Por ejemplo, especifique un segmentador de palabras para la segmentación de palabras.

{
    
    
  "query": {
    
    
    "match": {
    
    
      "content": {
    
    
        "query": "天王盖地虎",
        "analyzer": "ik_max_word"
      }
    }
  }
}

Estructura del índice

"name" : {
    
    
          "type" : "keyword",
          "store" : true
        }

Contenido del índice

"hits" : [
  {
    
    
    "_index" : "test_index05",
    "_type" : "_doc",
    "_id" : "1",
    "_score" : 1.0,
    "_source" : {
    
    
      "name" : "天王盖地虎",
      "sex" : 1,
      "age" : 25,
      "address" : "上海",
      "remark" : "java"
    }
  }
]

Ejemplo

POST /test_index05/_search
{
    
    
    "query":{
    
    
        "match":{
    
    
            "name":"天王盖地虎"
        }
    }
}

resultado

{
    
    
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
    
    
        "_index" : "test_index05",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
    
    
          "name" : "天王盖地虎",
          "sex" : 1,
          "age" : 25,
          "address" : "上海",
          "remark" : "java"
        }
      }
    ]
  }
}

6. Especifique el tokenizador ik de tipo de texto al crear una asignación estática

Especifique el campo de nombre como segmentador de palabras ik

PUT /test_index05
{
    
    
    "mappings":{
    
    
        "properties":{
    
    
            "name":{
    
    
                "type":"keyword",
                "index":true,
                "store":true
            },
            "sex":{
    
    
                "type":"integer",
                "index":true,
                "store":true
            },
            "age":{
    
    
                "type":"integer",
                "index":true,
                "store":true
            },
            "address":{
    
    
                "type":"text",
                "index":true,
                "store":true,
                "analyzer":"ik_smart",
                "search_analyzer":"ik_smart"
            },
            "remark":{
    
    
                "type":"text",
                "index":true,
                "store":true
            }
        }
    }
}

7. Modificar el mapeo de mapeo existente.

Manera simple:
①Cree un nuevo índice de mapeo estático que satisfaga sus necesidades

②Migrar los datos del índice antiguo al nuevo índice

POST _reindex
{
    
    
    "source":{
    
    
        "index":"index_old"
    },
    "dest":{
    
    
        "index":"index_new"
    }
}

③ Si aún desea utilizar el nombre del índice para realizar operaciones comerciales relacionadas, debe modificar el alias (opcional)
y establecer el alias del nuevo índice con el nombre del índice anterior, que se utiliza aquí 别名和索引一对一关系. (Un alias puede apuntar a múltiples índices, lo cual se discutirá más adelante)

PUT /index_new/_alias/index_old

El seguimiento explicará cómo afrontar este tipo de problemas en la empresa.

8. Control de concurrencia optimista de Elasticsearch

  1. control de concurrencia pesimista

    Este enfoque, ampliamente utilizado por las bases de datos relacionales, supone que pueden ocurrir conflictos de cambio y, por lo tanto, bloquea el acceso a los recursos para evitar conflictos. Un ejemplo típico es bloquear una fila de datos antes de leerla para garantizar que solo el hilo que coloca el bloqueo pueda modificar la fila de datos.

  2. Control de concurrencia optimista
    Este enfoque utilizado en Elasticsearch supone que los conflictos son imposibles y no bloquearán la operación que se intenta. Sin embargo, si los datos de origen se modifican durante la lectura o escritura, la actualización fallará. Luego, la aplicación decide cómo resolver el conflicto. Por ejemplo, las actualizaciones se pueden volver a intentar utilizando nuevos datos o informar al usuario.

ES新版本(7版本及以后版本)不使用version进行并发版本控制,使用 if_seq_no=版本值&if_primary_term=文档位置
Agregar un nuevo dato

PUT /test_index05/_doc/1
{
    
    
"name": "天王盖地虎",
"sex": 1,
"age": 25,
"address": "上海",
"remark": "java"
}

Actualizar el contenido de estos datos

POST /test_index05/_update/1
{
    
    
    "doc":{
    
    
        "name":"宝塔镇河妖"
    }
}

Resultado
Insertar descripción de la imagen aquí
actualizado nuevamente

POST /test_index05/_update/1/?if_seq_no=1&if_primary_term=1
{
    
    
    "doc":{
    
    
        "name":"秀儿"
    }
}

Resultado
Insertar descripción de la imagen aquí
Simular concurrencia
Ejecutar el comando nuevamente

POST /test_index05/_update/1/?if_seq_no=1&if_primary_term=1
{
    
    
    "doc":{
    
    
        "name":"秀儿"
    }
}

resultado
Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/xiaobai_july/article/details/129600153
Recomendado
Clasificación