Por que el numero de documentos en elastic es mayor a lo que tengo indexados?


(Alex Zuñiga) #1

Hola a todos, voy a tratar de ser directo en esta pregunta. Tengo indexados en varios tipos aproximadamente unos 60.000 documentos según yo, pero según el plugin de Elastic-Head, me dice que tengo, docs: 1.818.122 (1.864.182), por qué pasa esto ?

Este es el mapping de mi indice:

{
"censos": {
"aliases": {
},
"mappings": {
"parroquias": {
"properties": {
"codigo_canton": {
"type": "integer"
},
"codigo_parroquia": {
"type": "integer"
},
"codigo_provincia": {
"type": "integer"
},
"id_parroquia": {
"type": "integer"
},
"nombre_parroquia": {
"type": "string",
"analyzer": "standard"
}
}
},
"cantones": {
"_parent": {
"type": "provincias"
},
"_routing": {
"required": true
},
"properties": {
"codigo_canton": {
"type": "integer"
},
"codigo_pais": {
"type": "integer"
},
"codigo_provincia": {
"type": "integer"
},
"id_canton": {
"type": "integer"
},
"nombre_canton": {
"type": "string",
"analyzer": "standard"
}
}
},
"pais": {
"properties": {
"id_pais": {
"type": "integer"
},
"nombre_pais": {
"type": "string",
"analyzer": "standard"
}
}
},
"encuestas2": {
"properties": {
"encuestas2": {
"type": "nested",
"include_in_parent": true,
"properties": {
"id_pregunta": {
"type": "string"
},
"respuesta": {
"type": "integer"
}
}
},
"id_encuesta": {
"type": "integer"
}
}
},
"provincias": {
"_parent": {
"type": "pais"
},
"_routing": {
"required": true
},
"properties": {
"id_provincia": {
"type": "integer"
},
"nombre_provincia": {
"type": "string",
"analyzer": "standard"
}
}
}
},
"settings": {
"index": {
"creation_date": "1479865497005",
"number_of_shards": "5",
"number_of_replicas": "1",
"uuid": "qxzOdRQbTiSnsEKgtb10Og",
"version": {
"created": "2030299"
}
}
},
"warmers": {
}
}
}

Los documentos que estoy almacenando en el type encuestas2 tienen este formato:

{
"_index": "censos",
"_type": "encuestas2",
"_id": "14",
"_score": 1,
"_source": {
"id_encuesta": 14,
"encuestas2": [
{
"id_pregunta": "I01",
"respuesta": "1"
},
{
"id_pregunta": "I02",
"respuesta": "1"
},
{
"id_pregunta": "I03",
"respuesta": "50"
},
{
"id_pregunta": "I04",
"respuesta": "1"
},
{
"id_pregunta": "I05",
"respuesta": "1"
},
{
"id_pregunta": "I09",
"respuesta": "18"
},
{
"id_pregunta": "I10",
"respuesta": "1"
},
{
"id_pregunta": "URH",
"respuesta": "1"
},
{
"id_pregunta": "H00",
"respuesta": "1"
},
{
"id_pregunta": "H01",
"respuesta": "1"
},
{
"id_pregunta": "H01N",
"respuesta": ""
},
{
"id_pregunta": "H02",
"respuesta": "1"
},
{
"id_pregunta": "H03",
"respuesta": "2"
},
{
"id_pregunta": "H04",
"respuesta": "2"
},
{
"id_pregunta": "H05",
"respuesta": "1"
},
{
"id_pregunta": "H06",
"respuesta": "1"
},
{
"id_pregunta": "H07",
"respuesta": "2"
},
{
"id_pregunta": "H08",
"respuesta": "1"
},
{
"id_pregunta": "H09",
"respuesta": "2"
},
{
"id_pregunta": "H10",
"respuesta": "2"
},
{
"id_pregunta": "H11",
"respuesta": "2"
},
{
"id_pregunta": "H12",
"respuesta": "25"
},
{
"id_pregunta": "H12NP",
"respuesta": ""
},
{
"id_pregunta": "H13A",
"respuesta": "2"
},
{
"id_pregunta": "H13B",
"respuesta": ""
},
{
"id_pregunta": "H14A",
"respuesta": "2"
},
{
"id_pregunta": "H14B",
"respuesta": ""
},
{
"id_pregunta": "H15",
"respuesta": "1"
},
{
"id_pregunta": "M1",
"respuesta": "2"
},
{
"id_pregunta": "M2A",
"respuesta": "1"
},
{
"id_pregunta": "M2B",
"respuesta": "1"
},
{
"id_pregunta": "TP1",
"respuesta": "2"
},
{
"id_pregunta": "TH1",
"respuesta": "0"
},
{
"id_pregunta": "TM1",
"respuesta": "2"
}
]
}
}

De pronto ahí esta la respuesta, pero no se a ciencia cierta cual es ?

De antemano gracias.


(Gabriel Moskovicz) #2

Hola @pinky.floyano!

La respuesta como tu dices esta allí, en el `nested. Por ejemplo, si creo un indice de prueba asi, e indexo documentos:

PUT test
{
  "mappings": {
    "test": {
      "properties": {
        "nested_field": {
          "type": "string"
        }
      }
    }
  }
}
POST test/test
{
  "nested_field": [
    {
      "texto": "un texto"
    },
    {
      "texto": "otro texto"
    }
  ]
} 

Esto debería de ser un solo documento cierto? Pero en realidad los nested los guarda internamente separado. Entonces serian 3 documentos.

Si haces una búsqueda nos va a retornar 1 solo en la cantidad:

GET test/_search?size=0

#respuesta:

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0,
    "hits": []
  }
}

Pero si tomamos las estadísticas del indice nos retornara 3:

GET _cat/indices/test?v

#respuesta

health status index uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   test  rrjRUjU3QJmOUI4cvdwnaA   5   1          3            0      4.9kb          4.9kb

Y aquí vez que hay 3 documentos. 1 el principal y luego 2 internos ya que se guardan separados.

Head no es un producto oficial de elastic, pero puedes abrir el dev tools de Chrome o similares para verificar la llamada que esta haciendo, pero estimo que allí el problema (si queremos llamarlo problema, ya que en realidad es esperado).

Gracias!
--Gabriel


(Alex Zuñiga) #3

Gracias @gmoskovicz por responder.

Entiendo tu explicación pero a raíz de esto me salta otra pregunta, porque ES almacena internamente de esta forma mi documento Nested, que gana ES al guardar de esta manera los documentos?


(Gabriel Moskovicz) #4

Hola Alex,

Puedes ver la documentación aqui: https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html.

Basicamente sin nested, ES indexa un solo objecto con los campos todos juntos, por lo que no se pueden hacer búsquedas particulares para ver si un documento contiene dos campos en el mismo. Pero con nested guarda todos los documentos separados entonces hay una nested query que deja buscar de determinada manera que sino no seria posible.

Saludos


(Alex Zuñiga) #5

Ahora me quedó todo más claro. Gracias por tu ayuda.


(Gabriel Moskovicz) #6

Un placer.

Saludos


(system) #7

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.