tutorial - ¿Hacer elasticsearch solo devuelve ciertos campos?




elasticsearch tutorial (7)

Estoy usando elasticsearch para indexar mis documentos.

¿Es posible indicarle que solo devuelva campos específicos en lugar de todo el documento json que ha almacenado?


Aquí otra solución, ahora usando una expresión de coincidencia.

Filtrado de fuentes
Permite controlar cómo se devuelve el campo _source con cada golpe.

Probado con Elastiscsearch versión 5.5

La palabra clave "incluye" define los campos específicos.

GET /my_indice/my_indice_type/_search
{
    "_source": {
        "includes": [ "my_especific_field"]
        },
        "query": {
        "bool": {
                "must": [
                {"match": {
                    "_id": "%my_id_here_without_percent%"
                    }
                }
            ]
        }
    }
}

¡Sí! Utilice un filtro de origen . Si estás buscando con JSON, se verá algo así:

{
    "_source": ["user", "message", ...],
    "query": ...,
    "size": ...
}

En ES 2.4 y versiones anteriores, también podría usar la opción de campos para la API de búsqueda :

{
    "fields": ["user", "message", ...],
    "query": ...,
    "size": ...
}

Esto está en desuso en ES 5+. ¡Y los filtros de fuente son más poderosos de todos modos!


En java puedes usar setFetchSource como este:

client.prepareSearch(index).setTypes(type)
            .setFetchSource(new String[] { "field1", "field2" }, null)

Encontré que los documentos para la get api son útiles, especialmente las dos secciones, Filtrado de fuente y Campos : http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get.html

Afirman sobre el filtrado de fuente:

Si solo necesita uno o dos campos del _source completo, puede usar los parámetros _source_include & _source_exclude para incluir o filtrar las partes que necesita. Esto puede ser especialmente útil con documentos grandes donde la recuperación parcial puede ahorrar en la sobrecarga de la red

Que encajaba perfectamente con mi estuche de uso. Terminé simplemente filtrando la fuente así (usando la taquigrafía):

{
    "_source": ["field_x", ..., "field_y"],
    "query": {      
        ...
    }
}

Para su información, se indica en la documentación sobre el parámetro de campos :

La operación de obtención permite especificar un conjunto de campos almacenados que se devolverán al pasar el parámetro fields.

Parece atender a los campos que se han almacenado específicamente, donde coloca cada campo en una matriz. Si los campos especificados no se han almacenado, recuperará cada uno de los _source, lo que podría resultar en recuperaciones 'más lentas'. También tuve problemas para intentar que devolviera campos de tipo objeto.

Entonces, en resumen, tiene dos opciones, ya sea mediante el filtrado de origen o campos [almacenados].


Se podría realizar una solicitud GET de REST API con el parámetro '_source'.

Ejemplo de solicitud

http://localhost:9200/opt_pr/_search?q=SYMBOL:ITC AND OPTION_TYPE=CE AND TRADE_DATE=2017-02-10 AND EXPIRY_DATE=2017-02-23&_source=STRIKE_PRICE

Respuesta

{
"took": 59,
"timed_out": false,
"_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
},
"hits": {
    "total": 104,
    "max_score": 7.3908954,
    "hits": [
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLc",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 160
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLh",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 185
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLi",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 190
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLm",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 210
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLp",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 225
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLr",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 235
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLw",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 260
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uL5",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 305
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLd",
            "_score": 7.381078,
            "_source": {
                "STRIKE_PRICE": 165
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLy",
            "_score": 7.381078,
            "_source": {
                "STRIKE_PRICE": 270
            }
        }
    ]
}

}


response_filtering

Todas las API REST aceptan un parámetro filter_path que puede usarse para reducir la respuesta devuelta por elasticsearch. Este parámetro toma una lista de filtros separados por comas expresados ​​con la notación de puntos.

https://.com/a/35647027/844700


here you can specify whichever field you want in your output and also which you don't.

  POST index_name/_search
    {
        "_source": {
            "includes": [ "field_name", "field_name" ],
            "excludes": [ "field_name" ]
        },
        "query" : {
            "match" : { "field_name" : "value" }
        }
    }




elasticsearch