Buscar..


Observaciones

Es fácil ver el type s como una tabla en una base de datos SQL, donde el index es la base de datos SQL. Sin embargo, esa no es una buena manera de abordar el type s.

Todo sobre los tipos

De hecho, los tipos son, literalmente, solo un campo de metadatos agregado a cada documento por _type : _type . Los ejemplos anteriores crearon dos tipos: my_type y my_other_type . Eso significa que cada documento asociado con los tipos tiene un campo adicional automáticamente definido como "_type": "my_type" ; Esto se indexa con el documento, lo que lo convierte en un campo de búsqueda o de filtro , pero no afecta al documento sin formato, por lo que su aplicación no necesita preocuparse por ello.

Todos los tipos viven en el mismo índice y, por lo tanto, en los mismos fragmentos colectivos del índice. Incluso a nivel de disco, viven en los mismos archivos. La única separación que proporciona la creación de un segundo tipo es una lógica. Cada tipo, ya sea único o no, debe existir en las asignaciones y todas esas asignaciones deben existir en su estado de agrupación. Esto consume memoria y, si cada tipo se actualiza dinámicamente, consume el rendimiento a medida que cambian las asignaciones.

Como tal, es una buena práctica definir solo un tipo a menos que realmente necesite otros tipos. Es común ver escenarios donde son deseables múltiples tipos. Por ejemplo, imagina que tienes un índice de autos. Puede ser útil para usted descomponerlo en varios tipos:

  • BMW
  • caza
  • honda
  • mazda
  • mercedes
  • nissan
  • guardabosques
  • toyota
  • ...

De esta manera puede buscar todos los autos o limitarlos por fabricante a pedido. La diferencia entre esas dos búsquedas es tan simple como:

GET /cars/_search

y

GET /cars/bmw/_search

Lo que no es obvio para los nuevos usuarios de Elasticsearch es que la segunda forma es una especialización de la primera forma. Literalmente se reescribe a:

GET /cars/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term" : {
            "_type": "bmw"
          }
        }
      ]
    }
  }
}

Simplemente filtra cualquier documento que no haya sido indexado con un campo _type cuyo valor fue bmw . Dado que cada documento está indexado con su tipo como el campo _type , esto sirve como un filtro bastante simple. Si se proporcionó una búsqueda real en cualquiera de los dos ejemplos, entonces el filtro se agregará a la búsqueda completa según corresponda.

Como tal, si los tipos son idénticos, es mucho mejor suministrar un solo tipo (p. Ej., manufacturer en este ejemplo) e ignorarlo de manera efectiva. Luego, dentro de cada documento, proporcione explícitamente un campo llamado make o el nombre que prefiera y filtre manualmente cada vez que quiera limitarlo. Esto reducirá el tamaño de sus asignaciones a 1/n donde n es el número de tipos separados. Añade otro campo a cada documento, en beneficio de un mapeo simplificado.

En Elasticsearch 1.xy 2.x, este campo debe definirse como

PUT /cars
{
  "manufacturer": { <1>
    "properties": {
      "make": { <2>
        "type": "string",
        "index": "not_analyzed"
      }
    }
  }
}
  1. El nombre es arbitrario.
  2. El nombre es arbitrario y podría coincidir con el nombre de tipo si lo deseara también.

En Elasticsearch 5.x, lo anterior seguirá funcionando (está en desuso), pero la mejor manera es usar:

PUT /cars
{
  "manufacturer": { <1>
    "properties": {
      "make": { <2>
        "type": "keyword"
      }
    }
  }
}
  1. El nombre es arbitrario.
  2. El nombre es arbitrario y podría coincidir con el nombre de tipo si lo deseara también.

Los tipos deben usarse con moderación dentro de sus índices, ya que aumentan las asignaciones de índice, generalmente sin mucho beneficio. Debe tener al menos uno, pero no hay nada que diga que debe tener más de uno.

Preguntas comunes

  • ¿Qué sucede si tengo dos (o más) tipos que son en su mayoría idénticos, pero que tienen algunos campos únicos por tipo?

En el nivel de índice, no hay diferencia entre un tipo que se usa con unos pocos campos que se utilizan poco y entre varios tipos que comparten un grupo de campos no dispersos con unos pocos no compartidos (lo que significa que el otro tipo ni siquiera usa el campo). (s)).

Dicho de otra manera: un campo poco utilizado es escaso en todo el índice, independientemente de los tipos . La escasez no beneficia, o realmente perjudica, al índice solo porque está definido en un tipo separado.

Simplemente debe combinar estos tipos y agregar un campo de tipo separado.

  • ¿Por qué tipos separados necesitan definir campos exactamente de la misma manera?

Debido a que cada campo realmente solo se define una vez en el nivel de Lucene, independientemente de cuántos tipos haya. El hecho de que existan tipos es una característica de Elasticsearch y es solo una separación lógica.

  • ¿Puedo definir tipos separados con el mismo campo definido de manera diferente?

No. Si logra encontrar una manera de hacerlo en ES 2.x o posterior, debe abrir un informe de error . Como se señaló en la pregunta anterior, Lucene los ve a todos como un solo campo, por lo que no hay manera de hacer que esto funcione adecuadamente.

ES 1.x dejó esto como un requisito implícito, lo que permitió a los usuarios crear condiciones en las que las asignaciones de un fragmento en un índice realmente diferían de otro fragmento en el mismo índice. Esto fue efectivamente una condición de carrera y podría llevar a problemas inesperados.

Excepciones a la Regla

  • Los documentos padre / hijo requieren tipos separados para usarse dentro del mismo índice.
    • El padre vive en un tipo.
    • El niño vive en un tipo separado (pero cada niño vive en el mismo fragmento que su padre).
  • Los casos de uso de nichos extremos en los que la creación de toneladas de índices no es deseable y el impacto de campos dispersos es preferible a la alternativa.
    • Por ejemplo, el complemento de monitoreo de Elasticsearch, Marvel (1.xy 2.x) o X-Pack Monitoring (5.x +), monitorea a Elasticsearch en busca de cambios en el clúster, nodos, índices, índices específicos (el nivel del índice), e incluso los fragmentos. Podría crear más de 5 índices cada día para aislar los documentos que tienen asignaciones únicas o podría ir en contra de las mejores prácticas para reducir la carga de clústeres al compartir un índice (nota: la cantidad de asignaciones definidas es efectivamente la misma, pero la cantidad de índices creados). se reduce de n a 1).
    • Este es un escenario avanzado, pero debe tener en cuenta las definiciones de campos compartidos entre los tipos.

Creando explícitamente un índice con un tipo

Ejemplo utiliza HTTP básico, que se traduce fácilmente a cURL y otras aplicaciones HTTP. También coinciden con la sintaxis de Sense , que cambiará de nombre a Consola en Kibana 5.0.

Nota: El ejemplo inserta <#> para ayudar a llamar la atención sobre las partes. ¡Aquellos deben ser eliminados si lo copia!

PUT /my_index <1>
{
  "mappings": {
    "my_type": { <2>
      "properties": {
        "field1": {
          "type": "long"
        },
        "field2": {
          "type": "integer"
        },
        "object1": {
          "type": "object",
          "properties": {
            "field1" : {
              "type": "float"
            }
          }
        }
      }
    }
  },
  "my_other_type": {
    "properties": {
      "field1": {
        "type": "long" <3>
      },
      "field3": { <4>
        "type": "double"
      }
    }
  }
}
  1. Esto es crear el index utilizando el punto final crear índice.
  2. Esto está creando el type .
  3. ¡Los campos compartidos en el type s dentro del mismo index deben compartir la misma definición! ES 1.x no aplicó estrictamente este comportamiento, pero era un requisito implícito. ES 2.x y superior imponen estrictamente este comportamiento.
  4. Los campos únicos en el type s están bien.

Los índices (o índices) contienen tipos. Los tipos son un mecanismo conveniente para separar documentos, pero requieren que defina, ya sea de forma dinámica / automática o explícita, una asignación para cada tipo que use. Si define 15 tipos en un índice, entonces tiene 15 asignaciones únicas.

Vea las observaciones para obtener más detalles sobre este concepto y por qué puede o no desear usar tipos.

Crear dinámicamente un índice con un tipo

Ejemplo utiliza HTTP básico, que se traduce fácilmente a cURL y otras aplicaciones HTTP. También coinciden con la sintaxis de Sense , que cambiará de nombre a Consola en Kibana 5.0.

Nota: El ejemplo inserta <#> para ayudar a llamar la atención sobre las partes. ¡Aquellos deben ser eliminados si lo copia!

DELETE /my_index <1>

PUT /my_index/my_type/abc123 <2>
{
  "field1" : 1234, <3>
  "field2" : 456,
  "object1" : {
    "field1" : 7.8 <4>
  }
}
  1. En caso de que ya exista (debido a un ejemplo anterior), elimine el índice.
  2. my_index un documento en el índice, my_index , con el tipo, my_type y el ID abc123 (podría ser numérico, pero siempre es una cadena).
    • De forma predeterminada, la creación de índices dinámicos se habilita simplemente indexando un documento. Esto es ideal para entornos de desarrollo, pero no es necesariamente bueno para entornos de producción.
  3. Este campo es un número entero, por lo que la primera vez que se ve, debe asignarse. Elasticsearch siempre asume el tipo más ancho para cualquier tipo entrante, por lo que este se asignaría como un long lugar de un integer o un short (ambos podrían contener 1234 y 456 ).
  4. Lo mismo es cierto para este campo también. Se asignará como un double lugar de un float como desee.

Este índice y tipo creados dinámicamente coinciden aproximadamente con la asignación definida en el primer ejemplo. Sin embargo, es fundamental entender cómo <3> y <4> afectan las asignaciones definidas automáticamente.

Puedes seguir esto agregando otro tipo dinámicamente al mismo índice:

PUT /my_index/my_other_type/abc123 <1>
{
  "field1": 91, <2>
  "field3": 4.567
}
  1. El tipo es la única diferencia con respecto al documento anterior. La identificación es la misma y eso está bien! No tiene ninguna relación con los otros abc123 aparte de eso, pasa a ser en el mismo índice.
  2. field1 ya existe en el índice, por lo que debe ser el mismo tipo de campo definido en los otros tipos. El envío de un valor que era una cadena o que no es un entero fallaría (por ejemplo, "field1": "this is some text" o "field1": 123.0 ).

Esto crearía dinámicamente las asignaciones para my_other_type dentro del mismo índice, my_index .

Nota: Siempre es más rápido definir asignaciones por adelantado en lugar de que Elasticsearch lo realice dinámicamente en el momento del índice.

El resultado final de la indexación de ambos documentos sería similar al primer ejemplo, pero los tipos de campo serían diferentes y, por lo tanto, un poco inútil:

GET /my_index/_mappings <1>
{
  "mappings": {
    "my_type": { <2>
      "properties": {
        "field1": {
          "type": "long"
        },
        "field2": {
          "type": "long" <3>
        },
        "object1": {
          "type": "object",
          "properties": {
            "field1" : {
              "type": "double" <4>
            }
          }
        }
      }
    }
  },
  "my_other_type": { <5>
    "properties": {
      "field1": {
        "type": "long"
      },
      "field3": {
        "type": "double"
      }
    }
  }
}
  1. Esto utiliza el _mappings final _mappings para obtener las asignaciones del índice que creamos.
  2. Creamos dinámicamente my_type en el primer paso de este ejemplo.
  3. field2 ahora es un long lugar de un integer porque no lo definimos por adelantado. Esto puede resultar un desperdicio en el almacenamiento en disco.
  4. object1.field1 ahora es double por la misma razón que # 3 con las mismas ramificaciones que # 3.
    • Técnicamente, un long puede ser comprimido en muchos casos. Sin embargo, un double no se puede comprimir debido a que es un número de punto flotante.
  5. También creamos dinámicamente my_other_type en el segundo paso de este ejemplo. Su mapeo pasa a ser el mismo porque ya usábamos long y double .
    • Recuerde que field1 debe coincidir con la definición de my_type (y lo hace).
    • field3 es exclusivo de este tipo, por lo que no tiene tal restricción.


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow