Tabla de contenido
1. Descripción
ElasticSearch5.xy versiones posteriores utilizan texto y palabras clave como tipos de cadenas para reemplazar los tipos de cadenas de versiones anteriores. En la nueva versión, las cadenas se asignarán tanto a tipos de texto como de palabras clave de forma predeterminada.
Cadena (texto) : se utiliza para la indexación de texto completo. Este tipo de campo será segmentado por un segmentador de palabras y finalmente se usará para construir el índice;
Cadena (palabra clave) : no segmentado, solo se puede buscar el valor completo del campo. utilizado para mayor precisión Filtrado y agregación de coincidencias;
-----Observaciones:
Generalmente, los tipos booleanos y numéricos no requieren segmentación de palabras;
además, el tipo Fecha es especial, si agrega @JSONField(name = “file_upload_time”, format = “yyyy-MM-dd HH: mm:ss”) , indicando que la Fecha ha sido convertida según el formato, por lo que para no segmentar las palabras al realizar la consulta es necesario agregar la palabra clave;
2. Ejemplos de código
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder()
.must(QueryBuilders.termQuery("delete", Boolean.FALSE)) //Boolean类型
.must(QueryBuilders.termQuery("sid", 1111L)) //Long类型
.must(QueryBuilders.existsQuery("type.relegation_id")) //type为数组,relegation_id为string
.mustNot(QueryBuilders.termQuery("type.relegation_id.keyword", ""))
.must(QueryBuilders.rangeQuery("create_time.keyword").from("2022-01-01 00:00:01").to("2023-07-23 00:00:06")); //create_time是Date类型,加了format
StatsAggregationBuilder metricAggre = AggregationBuilders.stats("metric").field("file_size");
AggregationBuilder subAgg = AggregationBuilders.terms("group_by_extension")
.script(new Script("doc['w_extension.keyword'].value.toUpperCase()")).size(Integer.MAX_VALUE);
subAgg.subAggregation(metricAggre);
AggregationBuilder aggregationBuilder = AggregationBuilders.terms("group_by_base_id").field("type.relegation_id.keyword").size(Integer.MAX_VALUE);
aggregationBuilder.subAggregation(subAgg);