Guía práctica de manejo de valores nulos de Elasticsearch

1. Introducción

En escenarios comerciales reales, a menudo se encuentran situaciones en las que define valores nulos y recupera datos de valores nulos especificados.

En este momento, cuando miremos la sección null_value del documento oficial, veremos la siguiente descripción:

Acepta un valor de cadena que se sustituye por cualquier valor nulo explícito. El valor predeterminado es nulo, lo que significa que el campo se trata como perdido.

Acepte un valor de cadena para reemplazar todos los valores nulos explícitos. El valor predeterminado es nulo, lo que significa que el campo se considera faltante.

Un valor nulo no se puede indexar ni buscar. Cuando un campo se establece en nulo (o una matriz vacía o una matriz de valores nulos) se trata como si ese campo no tuviera valores.

Los valores nulos no se pueden indexar ni buscar. Cuando un campo se establece en nulo (o una matriz vacía o una matriz de valores nulos), se trata como si el campo no tuviera valor.

Solo mire el significado literal, ¿no se siente difícil de entender?

Está bien, agáchate hasta la muerte y descubre:

DELETE my-index-000001
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "status_code": {
        "type": "keyword"
      },
      "title": {
        "type": "text"
      }
    }
  }
}

PUT my-index-000001/_bulk
{"index":{"_id":1}}
{"status_code":null,"title":"just test"}
{"index":{"_id":2}}
{"status_code":"","title":"just test"}
{"index":{"_id":3}}
{"status_code":[],"title":"just test"}

POST my-index-000001/_search

POST my-index-000001/_search
{
  "query": {
    "term": {
      "status_code": null
    }
  }
}

La búsqueda anterior devuelve el error de la siguiente manera:

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "field name is null or empty"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "field name is null or empty"
  },
  "status": 400
}

2. El significado de null_value

El parámetro null_value le permite reemplazar valores nulos explícitos con el valor especificado para que pueda indexarse ​​y buscarse. 

Utilice el parámetro null_value para reemplazar el valor nulo explícito con el valor especificado para que pueda indexarse ​​y buscarse. P.ej:

DELETE my-index-000001
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "status_code": {
        "type":       "keyword",
        "null_value": "NULL"
      }
    }
  }
}

PUT my-index-000001/_bulk
{"index":{"_id":1}}
{"status_code":null}
{"index":{"_id":2}}
{"status_code":[]}
{"index":{"_id":3}}
{"status_code":"NULL"}

GET my-index-000001/_search
{
  "query": {
    "term": {
      "status_code": "NULL"
    }
  }
}

Tenga en cuenta que el resultado se devuelve aquí: los documentos con _id = 1 y _id = 3, pero los documentos con _id = 2 no se incluyen.

Explique:

"null_value": El significado de "NULL": reemplaza el valor nulo explícito con el valor especificado. "NULL" se puede personalizar. Por ejemplo, en el sistema empresarial, podemos definirlo como "Unkown".

Las explicaciones vernáculas que todos pueden entender son las siguientes:

  • Equivale a especificar un valor predeterminado vacío en la etapa de definición de mapeo y reemplazarlo con "NULL". La ventaja de esto: similar al documento con _id = 1 arriba, los campos vacíos también se pueden indexar y recuperar.

  • Ya no se informará del error "el nombre del campo es nulo o está vacío".

3. Nota sobre el uso de null_value

  • Null_value debe coincidir con el tipo de datos definido. Por ejemplo, un campo de tipo largo no puede tener un valor nulo de tipo cadena.

La siguiente definición reportará un error:

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "status_code": {
        "type": "keyword"
      },
      "title": {
        "type": "long",
        "null_value": "NULL"
      }
    }
  }
}

El error es el siguiente:

{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "Failed to parse mapping [_doc]: For input string: \"NULL\""
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "Failed to parse mapping [_doc]: For input string: \"NULL\"",
    "caused_by": {
      "type": "number_format_exception",
      "reason": "For input string: \"NULL\""
    }
  },
  "status": 400
}

Explique: Obviamente causado por la falta de coincidencia de tipos.

  • Null_value solo afecta el índice de los datos y no modifica el documento _source.

4. ¿Qué campos tienen null_value y qué campos no tienen null_value?

Se admiten los siguientes campos comunes principales: null_value.

  • Matrices

  • Booleano

  • Fecha

  • geo_point

  • IP

  • Palabra clave

  • Numérico

  • punto

No me preguntes cómo lo sé, está confirmado por los documentos oficiales que revisé.

Las preguntas más frecuentes:

4.1 Pregunta 1: ¿El tipo de texto no admite null_value?

Sí, no es compatible.

Vamos, lucha de verdad:

DELETE my-index-000001
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "status_code": {
        "type": "keyword"
      },
      "title": {
        "type": "text",
        "null_value": "NULL"
      }
    }
  }
}

Los resultados devueltos son los siguientes:

{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "Mapping definition for [title] has unsupported parameters:  [null_value : NULL]"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "Failed to parse mapping [_doc]: Mapping definition for [title] has unsupported parameters:  [null_value : NULL]",
    "caused_by": {
      "type": "mapper_parsing_exception",
      "reason": "Mapping definition for [title] has unsupported parameters:  [null_value : NULL]"
    }
  },
  "status": 400
}

Pregunta 2: Si el tipo de texto también quiere establecer un valor nulo, ¿qué debo hacer?

Recomiende varios campos para satisfacer las necesidades comerciales con la ayuda de una combinación de palabras clave y texto.

La referencia de definición es la siguiente:

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "status_code": {
        "type": "keyword"
      },
      "title": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "null_value": "NULL"
          }
        }
      }
    }
  }
}

Para los campos de tipo de texto, en escenarios comerciales reales, a menudo necesitamos establecer al mismo tiempo: campos múltiples, establecer la combinación de texto y palabra clave.

El tipo de texto se utiliza para la búsqueda de texto completo y la palabra clave se utiliza para la agregación y la clasificación.

Al mismo tiempo, multi_fields es uno de los sitios de prueba principales para los ingenieros certificados de Elastic, y todos deben dominarlo.

5. Discusión de problemas en línea

Queridos amigos, hagan una pregunta. Ahora tengo un campo de contenido en los datos. Quiero consultar si este campo no es una cadena vacía. No puedo usar must_not. Publiqué mi sql

El grupo de intercambio de tecnología Elasticsearch

Mi interpretación es la siguiente:

Cuéntame sobre la forma correcta de escribir esta pregunta y las razones por las que antes estaba mal escrita.

La esencia de juzgar si está vacío es: el problema de coincidencia exacta no es la categoría de búsqueda de texto completo (coincidencia de similitud), por lo que la selección y el uso: match_phrase provocará el siguiente error. Debería usar: término.

POST test_001/_search
{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "cont"
              }
            },
            {
              "term": {
                "content.keyword": {
                  "value": ""
                }
              }
            }
          ]
        }
      }
    }
  }
}

Nota: ¡El significado de la búsqueda existente es determinar si el campo existe y el uso combinado tiene un mejor efecto y es más seguro!

El siguiente script también se puede implementar, pero debido a problemas de rendimiento, no se recomienda utilizarlo en el nivel empresarial real.

POST test_001/_search
{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": {
            "source": "doc['content.keyword'].length == 1",
            "lang": "painless"
          }
        }
      }
    }
  }
}

Imagine que si define la combinación de campos de texto y palabras clave durante la fase de modelado de datos de la definición de mapeo y establece null_value para la palabra clave, este problema se resolverá mejor.

6. Resumen

Como dijo Luo Pang: No importa cuán obvia sea la verdad, al menos 100 millones de personas en China no lo saben.

Sin embargo, creo que la tecnología Elasticsearch también es un punto técnico obvio En el círculo de tecnología Elastic de China, al menos N mucha gente no lo sabe.

¿Cómo hacer? ¡Derriba y descúbrelo!

¿Cómo maneja su escenario empresarial los valores nulos? Bienvenido a dejar un mensaje para discutir.

7. Refrigerios-Discusión

Algunos lectores tienen mensajes privados:

De hecho, el jefe también puede aprender de otras cuentas y volver a publicar algunos artículos de tráfico de big V o grandes empresas, con imágenes y textos. Aunque es posible que no todos lo entiendan, se ve muy bien, y dar tu cuenta oficial también puede aumentar los fanáticos. , ¡Que asombroso! Tienes solo un artículo a la semana y todos se han ido.

mi respuesta:

Cada cuenta oficial tiene su propia misión y valor de existencia. Puedes compararla cuidadosamente. Cada titular de cuenta tiene sus propias características. ¿Por qué deberían converger? Siento que esto también es muy bueno (es decir, amargo, más pobre), y desde una perspectiva a largo plazo (diez años o más), el valor de la perseverancia puede reflejarse.

Agrega WeChat: elastic6 (solo quedan unos pocos hoyos) y trabaja duro con los jefes de BAT para mejorar la tecnología Elastic.


Lectura recomendada:

Heavy | Lista de conocimiento de la metodología Elasticsearch (Día Nacional actualizado 2020)

¡Puede aprobar el examen de certificación Elastic con una licencia de conducir!


¡Más tiempo más rápido aprendió más y más seco!

¡Casi el  50 % de  ingenieros certificados en Elastic en China provienen de aquí!

¡Lucha  con Elasticsearch con más de 800 entusiastas de Elastic en todo el mundo  !

Supongo que te gusta

Origin blog.csdn.net/wojiushiwo987/article/details/109712672
Recomendado
Clasificación