elasticsearch: explicación detallada de las llamadas http y Java

1 operación HTTP

1.1 Operación de índice

1.1.1Crear índice

poner solicitud :http:// 127.0.0.1:9200/shopping

1.1.2 Ver todos los índices

obtener solicitud: http:// 127.0.0.1:9200/_cat/indices?v

Encabezamiento significado
salud Estado de salud actual del servidor: verde (el clúster está completo) amarillo (un solo punto es normal, el clúster está incompleto) rojo (un solo punto es anormal)
estado Estado del índice abierto o cerrado
índice Nombre del índice
UUID Número unificado de índice
en Número de fragmentos primarios
reps Número de copias
docs.count Número de documentos disponibles
documentos eliminados Estado de eliminación del documento (lápida)
tienda.tamaño El espacio total ocupado por fragmentos primarios y secundarios.
pri.tienda.tamaño El espacio ocupado por el fragmento primario.

1.1.3 Ver un índice único

obtener solicitud: http://127.0.0.1:9200/shopping

1.1.4 Eliminar índice

borrar petición: http://127.0.0.1:9200/shopping

1.2 Operaciones de documentos

1.2.1 Crear documentos

solicitud de publicación: http://127.0.0.1:9200/shopping/_doc
cuerpo de la solicitud:

{
    
    
  "title":"小米手机","category":"小米",         
  "images":"http://www.gulixueyuan.com/xm.jpg", 
  "price":3999.00
}

Después de crear los datos anteriores, dado que no se especifica ningún identificador único (ID) de datos, el servidor ES generará uno aleatoriamente de forma predeterminada.
Si desea personalizar el identificador único, debe especificarlo al crear:http:// 127.0.0.1:9200/shopping/_doc/1

1.2.2 Ver documentos

obtener solicitud: http:// 127.0.0.1:9200/shopping/_doc/1
devolver resultado:

{
    
    
  "_index" 【索引】 : "shopping",
  "_type" 【文档类型】 : "_doc",
  "_id": "1",
  "_version": 2,
  "_seq_no": 2,
  "_primary_term": 2,
  "found" 【查询结果】 : true, # true 表示查找到, false 表示未查找到
  "_source" 【文档源信息】 : {
    
    
    "title": "华为手机",
    "category": "华为",
    "images": "http://www.gulixueyuan.com/hw.jpg",
    "price": 4999.00
  }
}

1.2.3 Modificar documentos

solicitud de publicación: http:// 127.0.0.1:9200/shopping/_doc/1
cuerpo de la solicitud:

{
    
    
  "title":"华为手机",
  "category":"华为",
  "images":"http://www.gulixueyuan.com/hw.jpg",
  "price":4999.00
}

Respuesta después de una modificación exitosa:

{
    
    
  "_index": "shopping",
  "_type": "_doc",
  "_id": "1",
  "_version" 【版本】 : 2,
  "result" 【结果】 : "updated", # updated 表示数据被更新
  "_shards": {
    
    
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 2,
  "_primary_term": 2
}

1.2.4 Modificar campos

solicitud de publicación: http://127.0.0.1:9200/shopping/_update/1
cuerpo de la solicitud:

{
    
    
  "doc": {
    
    
      "price":3000.00
  }
}

1.2.5 Eliminar documentos

solicitud de eliminación: http://127.0.0.1:9200/shopping/_doc/1
respuesta de eliminación exitosa:

{
    
    
  "_index": "shopping",
  "_type": "_doc",
  "_id": "1",
  "_version" 【版本】    : 4, #对数据的操作,都会更新版本
  "result" 【结果】 :    "deleted", # deleted 表示数据被标记为删除
  "_shards": {
    
    
  "total": 2,
  "successful": 1,
  "failed": 0
  },
  "_seq_no": 4,
  "_primary_term": 2
} 

Si elimina un documento que no existe, se devuelve el resultado:

{
    
    
  "_index": "shopping",
  "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "result" 【结果】 : "not_found", # not_found 表示未查找到
  "_shards": {
    
    
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no":
  "_primary_term": 2
}

1.2.6 Eliminación condicional de documentos

Generalmente, los datos se eliminan según el identificador único del documento. En la operación real, también se pueden eliminar varios datos según las condiciones.
Solicitud posterior: http://127.0.0.1:9200/shopping/_delete_by_query
Cuerpo de la solicitud:

{
    
    
  "query":{
    
    
    "match":{
    
    
      "price":4000.00
    }
  }
}

Resultado de la respuesta después de una eliminación exitosa:

{
    
    
  "took"【耗时】 : 175,
  "timed_out"【是否超时】 : false,
  "total"【总数】 : 2,
  "deleted"【删除数量】 : 2,
  "batches": 1,
  "version_conflicts": 0,
  "noops": 0,
  "retries": {
    
    
    "bulk": 0,
    "search": 0
  },
  "throttled_millis": 0,
  "requests_per_second": -1.0,
  "throttled_until_millis": 0,
  "failures": []
}

1.3 Operación de mapeo

Crear una tabla de base de datos requiere establecer nombres de campos, tipos, longitudes, restricciones, etc.; lo mismo ocurre con la biblioteca de índices. Necesita saber qué campos están bajo este tipo y qué información de restricciones tiene cada campo. Esto se llama mapeo.

1.3.1 Crear mapeo

poner solicitud: http://127.0.0.1:9200/student/_mapping
cuerpo de la solicitud:

{
    
    
  "properties": {
    
    
    "name":{
    
    
    "type": "text",
    "index": true
    },
    "sex":{
    
    
      "type": "text",
      "index": false
    },
    "age":{
    
    
      "type": "long",
      "index": false
    }
  }
}

Descripción de los datos de mapeo:

  • Nombre del campo: complete lo que desee, especifique muchos atributos a continuación, por ejemplo:title 、subtitle 、images 、price
  • tipo: Tipo, los tipos de datos admitidos en Elasticsearch son muy ricos, aquí hay algunos clave:
    • Tipo de cadena , dividido en dos tipos.
      • texto : palabra separable
      • palabra clave : no se puede dividir en palabras, los datos se compararán como un campo completo
    • Numérico : tipo numérico, dividido en dos categorías.
      • Tipos de datos básicos :long 、integer、short 、byte 、double、float 、half_float
      • Tipo de alta precisión para números de coma flotante :scaled_float
    • Fecha : fecha clase
    • Matriz : tipo de matriz
    • Objeto : objeto
  • índice : ya sea para indexar, el valor predeterminado es verdadero, lo que significa que todos los campos se indexarán sin ninguna configuración.
    • verdadero : el campo se indexará y se podrá utilizar para realizar búsquedas.
    • false : el campo no se indexará y no se podrá buscar
  • store : si se deben almacenar datos de forma independiente, el valor predeterminado es falso

El texto original se almacenará en _source. De forma predeterminada, otros campos extraídos no se almacenan de forma independiente, sino que se extraen de _source. Por supuesto, también puede almacenar un campo de forma independiente. Simplemente configure "store": true. Obtener un campo almacenado de forma independiente es mucho más rápido que analizarlo desde _source, pero también ocupará más espacio, por lo que debe determinarse de acuerdo con el Situación real Establecer según las necesidades del negocio.

  • analizador : segmentador de palabras, ik_max_word aquí significa usar el segmentador de palabras ik

1.3.2 Ver mapeo

obtener solicitud :http://127.0.0.1:9200/student/_mapping

1.3.3 Asociación de mapeo de índice

poner solicitud :http:// 127.0.0.1:9200/student1

{
    
    
  "settings": {
    
    },
  "mappings": {
    
    
    "properties": {
    
    
      "name":{
    
    
      "type": "text",
      "index": true
    },
    "sex":{
    
    
      "type": "text",
      "index": false
    },
    "age":{
    
    
      "type": "long",
      "index": false
    }
    }
  }
} 

1.3.4 Consulta avanzada

1) Consultar todos los documentos.

obtener solicitud :http:// 127.0.0.1:9200/student/_search

{
    
    
  "query": {
    
    
  "match_all": {
    
    }
  }
}
  • query: La consulta aquí representa un objeto de consulta, que puede tener diferentes atributos de consulta.
  • match_all: Tipo de consulta, por ejemplo: match_all (representa consultar todo), coincidencia, término, rango, etc.
  • {Condiciones de consulta}: las condiciones de consulta devolverán resultados basados ​​en diferentes tipos y métodos de escritura :
{
    
    
  "took 【查询花费时间,单位毫秒】 " : 1116,
  "timed_out 【是否超时】 " : false,
  "_shards 【分片信息】 " : {
    
    
    "total 【总数】 " : 1,
    "successful 【成功】 " : 1,
    "skipped 【忽略】 " : 0,
    "failed 【失败】 " : 0
  },
  "hits 【搜索命中结果】 " : {
    
    
  "total" 【搜索条件匹配的文档总数】 : {
    
    
    "value" 【总命中计数的值】 : 3,
    "relation" 【计数规则】 : "eq" # eq 表示计数准确,  gte 表示计数不准确
  },
  "max_score 【匹配度分值】 " : 1.0,
  "hits 【命中结果集合】 " : [
    ......
    }
  ]
  }
}

2) Consulta de coincidencia

La consulta de tipo de coincidencia segmentará las condiciones de la consulta en palabras y luego realizará la consulta. Existe una relación o entre varias entradas.
Obtener solicitud : http:// 127.0.0.1:9200/student/_search
Cuerpo de la solicitud:

{
    
    
"query": {
    
    
  "match": {
    
    
    "name":"zhangsan"
    }
  }
}

3) Consulta de coincidencia de campos

multi_matchSimilar a Match, excepto que puede realizar consultas en varios campos.
obtener solicitud : http:// 127.0.0.1:9200/student/_search
cuerpo de la solicitud:

{
    
    
"query": {
    
    
"multi_match": {
    
    
  "query": "zhangsan",
  "fields": ["name","nickname"]
  }
}

4) Consulta precisa de palabras clave

termConsulta, consulta precisa de concordancia de palabras clave, sin segmentación de palabras de las condiciones de consulta.
obtener solicitud :http:// 127.0.0.1:9200/student/_search

{
    
    
  "query": {
    
    
    "term": {
    
    
    "name": {
    
    
      "value": "zhangsan"
      }
    }
  }
}

5) Consulta precisa de varias palabras clave

termsLa consulta es la misma que la consulta de términos, pero le permite especificar varios valores para que coincidan.
OBTENER solicitud :http:// 127.0.0.1:9200/student/_search

{
    
    
  "query": {
    
    
  "terms": {
    
    
    "name": ["zhangsan","lisi"]
    }
  }
}

6) Especificar campos de consulta

_sourceDe forma predeterminada, Elasticsearch devolverá todos los campos almacenados en el documento en los resultados de la búsqueda . Si solo queremos obtener algunos de los campos, podemos agregar el filtrado de
solicitud _source.GET :http:// 127.0.0.1:9200/student/_search

{
    
    
  "_source": ["name","nickname"],
  "query": {
    
    
    "terms": {
    
    
      "nickname": ["zhangsan"]
      }
  }
} 

7) Filtrar campos

También podemos pasar:

  • incluye : para especificar los campos que desea mostrar
  • excluye : para especificar los campos que no desea mostrar
    en las solicitudes GET :http:// 127.0.0.1:9200/student/_search
{
    
    
  "_source": {
    
    
  "includes": ["name","nickname"]
  },
  "query": {
    
    
    "terms": {
    
    
    "nickname": ["zhangsan"]
    }
  }
}

8) consulta combinada

boolCombine varias otras consultas a través de solicitudes GETmust (debe), must_not(no debe), should(no debería) :
http:// 127.0.0.1:9200/student/_search

{
    
    
"query": {
    
    
  "bool": {
    
    
    "must": [
      {
    
    
        "match": {
    
    
        	"name": "zhangsan"
        }
      }
      ],
      "must_not": [
        {
    
    
          "match": {
    
    
          	"age": "40"
        }
      }
      ],
      "should": [
        {
    
    
        "match": {
    
    
        	"sex": "男"
        }
      }
    ]
  }
}

9) consulta de rango

rangeLa consulta encuentra aquellos números o tiempos que se encuentran dentro de un intervalo específico. La consulta de rango permite los siguientes caracteres.

Operador ilustrar
gt Mayor que>
gte Mayor o igual a >=
es menos que <
lte Menor o igual a <=

obtener solicitud :http:// 127.0.0.1:9200/student/_search

{
    
    
  "query": {
    
    
  "range": {
    
    
    "age": {
    
        
      "gte":    30,
      "lte":    35
      }
    }
  }
}

10) consulta difusa

Devuelve documentos que contienen palabras similares a los términos de búsqueda.
Para encontrar términos similares, una consulta difusa crea un conjunto de todas las posibles variaciones o expansiones de un término de búsqueda dentro de una distancia de edición especificada. Luego, la consulta devuelve una coincidencia exacta para cada expansión.
OBTENER solicitud :http:// 127.0.0.1:9200/student/_search

{
    
    
"query": {
    
    
    "fuzzy": {
    
    
    "title": {
    
    
        "value": "zhangsan",
        "fuzziness": 2
      }
    }
  }
}

11) Clasificación de campo único

sortNos permite ordenar por diferentes campos y especificar el método de clasificación mediante orden. desc orden descendente, asc orden ascendente.
OBTENER solicitud :http:// 127.0.0.1:9200/student/_search

{
    
    
  "query": {
    
    
  "match": {
    
    
  "name":"zhangsan"
  }
  },
  "sort":    [{
    
    
  "age":    {
    
    
  "order":"desc"
  }
  }]
}

12) Clasificación de campos múltiples

Supongamos que queremos consultar usando edad y _score juntos, y los resultados coincidentes se ordenan primero por edad y luego por puntuación de relevancia
Solicitud GET :http:// 127.0.0.1:9200/student/_search

{
    
    
  "query": {
    
    
    	"match_all": {
    
    }
  },
  "sort": [
    {
    
    
      "age": {
    
    
      	"order": "desc"
      }
    },
    {
    
    
      "_score":{
    
    
      	"order": "desc"
      }
    }
  ]
}

13) Consulta destacada

Elasticsearch puede establecer etiquetas y estilos (resaltado) para la parte de palabras clave en el contenido de la consulta. Mientras usa matchla consulta, agregue un highlightatributo:

  • pre_tags : etiquetas previas
  • post_tags : etiquetas de publicación
  • campos : campos que deben resaltarse
  • título : Aquí se declara que el campo de título debe resaltarse. Puede establecer una configuración única para este campo más adelante o puede estar vacío.

OBTENER solicitud :http:// 127.0.0.1:9200/student/_search

{
    
    
"query": {
    
    
"match": {
    
    
"name": "zhangsan"
}
},
"highlight": {
    
    
"pre_tags": "<font color='red'>",
"post_tags": "</font>",
"fields":    {
    
    
"name":    {
    
    }
}
}
}

14) consulta de paginación

from : El índice inicial de la página actual, comenzando desde 0 de forma predeterminada. from = (pageNum - 1) * tamaño
tamaño : cuántas
solicitudes GET se muestran en cada página :http:// 127.0.0.1:9200/student/_search

{
    
    
"query": {
    
    
"match_all": {
    
    }
},
"sort": [
{
    
    
"age": {
    
    
"order": "desc"
}
}
],
"from":    0,
"size":    2
}

15) Consulta de agregación

La agregación permite a los usuarios realizar análisis estadísticos en documentos ES, similares a las bases de datos relacionales group by. Por supuesto, hay muchas otras agregaciones, como valor máximo, valor promedio, etc.

  • Obtener el valor máximo de un campo max
{
    
    
"aggs":{
    
    
"max_age":{
    
    
"max":{
    
    "field":"age"}
}
},
"size":0
}
  • Sumar un campo
{
    
    
"aggs":{
    
    
"sum_age":{
    
    
"sum":{
    
    "field":"age"}
}
},
"size":0
}
  • Promedio de un campo promedio
{
    
    
"aggs":{
    
    
"avg_age":{
    
    
"avg":{
    
    "field":"age"}
}
},
"size":0
}
  • Deduplicar el valor de un campo y luego obtener el número total
{
    
    "aggs":{
    
    
"distinct_age":{
    
    
"cardinality":{
    
    "field":"age"}
}
},
"size":0
} 
  • Agregación de estados
    stats , rendimientos count, y cinco indicadores para un determinado campo a la vezmaxminavgsum
{
    
    
"aggs":{
    
    
"stats_age":{
    
    
"stats":{
    
    "field":"age"}
}
},
"size":0
}

16) Consulta de agregación de depósitos

La suma del depósito es equivalente a la declaración group by en SQL

  • Agregación, estadísticas de agrupación.
{
    
    
"aggs":{
    
    
"age_groupby":{
    
    
"terms":{
    
    "field":"age"}
}
},
"size":0
}
  • Agregado bajo el grupo de términos
{
    
    
"aggs":{
    
    
"age_groupby":{
    
    
"terms":{
    
    "field":"age"}
}
},
"size":0
}

2. Operaciones de la API de Java

El software Elasticsearch está desarrollado en lenguaje Java, por lo que también se puede acceder al servicio Elasticsearch a través de la API de Java.

2.1 Crear elemento Maven

Modifique el archivo pom y agregue dependencias de Maven

<dependencies>
    <dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.8.0</version>
    </dependency>
    <!-- elasticsearch 的客户端 -->
    <dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.8.0</version>
    </dependency>
    <!-- elasticsearch 依赖 2.x 的 log4j -->
    <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.8.2</version>
    </dependency>
    <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.8.2</version>
    </dependency>
    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9</version>
    </dependency>
    <!-- junit 单元测试 -->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    </dependency>
    </dependencies>

2.1.1 Objeto cliente

Cree com.atguigu.es.test.Elasticsearch01_Clientla clase y cree el objeto de cliente Elasticsearch en el código

// 创建客户端对象
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
...
// 关闭客户端连接
client.close();

2.1.2 Operación de índice

Una vez que el servidor ES se inicia normalmente, el índice ES se puede operar a través del objeto cliente API de Java.

1) Crear índice

// 创建索引 - 请求对象
CreateIndexRequest request = new CreateIndexRequest("user");
// 发送请求,获取响应
CreateIndexResponse response = client.indices().create(request,
RequestOptions.DEFAULT);
boolean acknowledged = response.isAcknowledged();
// 响应状态
System.out.println("操作状态 = " + acknowledged);

2) índice de consulta

// 查询索引 - 请求对象
GetIndexRequest request = new GetIndexRequest("user");
// 发送请求,获取响应
GetIndexResponse response = client.indices().get(request,
RequestOptions.DEFAULT);
System.out.println("aliases:"+response.getAliases());
System.out.println("mappings:"+response.getMappings());
System.out.println("settings:"+response.getSettings());

3) Eliminar índice

// 删除索引 - 请求对象
DeleteIndexRequest request = new DeleteIndexRequest("user");
// 发送请求,获取响应
AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
// 操作结果
System.out.println("操作结果 :  " + response.isAcknowledged());

2.1.3 Operaciones con documentos

1) Agregar nuevos documentos

Crear modelo de datos

class User {
    
    
    private String name;
    private Integer age;
    private String sex;
    public String getName() {
    
    
    return name;
    }
    public void setName(String name)
    this.name = name;
    }
    public Integer getAge() {
    
    
    
    return age;
    }
    public void    setAge(Integer age) {
    
    
    this.age    = age;
    }
    public String getSex() {
    
    
    return sex;
    }
    public void setSex(String sex) {
    
    
    this.sex = sex;
    }
    }

Crear datos y agregarlos al documento.

// 新增文档 - 请求对象
IndexRequest request = new IndexRequest();
// 设置索引及唯一性标识
request.index("user").id("1001");
// 创建数据对象
User user = new User();
user.setName("zhangsan");
user.setAge(30);
user.setSex("男");
ObjectMapper objectMapper = new ObjectMapper();
String productJson = objectMapper.writeValueAsString(user);
// 添加文档数据,数据格式为 JSON 格式
request.source(productJson,XContentType.JSON);
// 客户端发送请求,获取响应对象
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
3.打印结果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());

2) Modificar el documento

// 修改文档 - 请求对象
UpdateRequest request = new UpdateRequest();
// 配置修改参数
request.index("user").id("1001");
// 设置请求体,对数据进行修改
request.doc(XContentType.JSON, "sex", "女");
// 客户端发送请求,获取响应对象
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());

3) Consultar documentos

//1.创建请求对象
GetRequest request = new GetRequest().index("user").id("1001"); //2.客户端发送请求,获取响应对象
GetResponse response = client.get(request, RequestOptions.DEFAULT); 3.打印结果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_type:" + response.getType());
System.out.println("_id:" + response.getId());
System.out.println("source:" + response.getSourceAsString());

4) Eliminar documento

//创建请求对象
DeleteRequest request = new DeleteRequest().index("user").id("1");
//客户端发送请求,获取响应对象
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT); //打印信息
System.out.println(response.toString());

5) Operación por lotes

//创建批量新增请求对象
BulkRequest request = new BulkRequest();
request.add(new
IndexRequest().index("user").id("1001").source(XContentType.JSON, "name",
"zhangsan"));
request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name",
"lisi"));
request.add(new
IndexRequest().index("user").id("1003").source(XContentType.JSON, "name",
"wangwu"));
//客户端发送请求,获取响应对象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
//打印结果信息
System.out.println("took:" + responses.getTook());
System.out.println("items:" + responses.getItems());
  • eliminación por lotes:
//创建批量删除请求对象
BulkRequest request = new BulkRequest();
request.add(new DeleteRequest().index("user").id("1001"));
request.add(new DeleteRequest().index("user").id("1002"));
request.add(new DeleteRequest().index("user").id("1003"));
//客户端发送请求,获取响应对象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT); //打印结果信息
System.out.println("took:" + responses.getTook());
System.out.println("items:" + responses.getItems());

2.1.4 Consulta avanzada

1) Solicitar consulta del cuerpo

  • Consultar todos los datos del índice
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.               ());
request.source(sourceBuilder);

SearchResponse response = client.search (request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:"    + response.isTimedOut());
System.out.println("total:" +    hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
   //输出每条查询的结果信息
   System.out.println(hit.getSourceAsString());
}
  • consulta de términos, las condiciones de la consulta son palabras clave
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.termQuery ("age", "30"));    request.source(sourceBuilder);
SearchResponse response = client.search (request, RequestOptions.DEFAULT); // 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:" + response.isTimedOut());
System.out.println("total:" + hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
//输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
  • consulta de paginación
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 分页查询
// 当前页其实索引 (第一条数据的顺序号),from
sourceBuilder.from(0);
// 每页显示多少条 size
sourceBuilder.size(2);
request.source(sourceBuilder);
SearchResponse response = client.search (request, RequestOptions.DEFAULT); // 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:" + response.isTimedOut());
System.out.println("total:" + hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
//输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
  • clasificación de datos
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 排序
sourceBuilder.sort("age", SortOrder.ASC);
request.source(sourceBuilder);
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:"    + response.isTimedOut());
System.out.println("total:" +    hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
//输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
  • Filtrar campos
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");

// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery());

//查询字段过滤
String[] excludes = {
    
    };
String[] includes = {
    
    "name", "age"};
sourceBuilder.fetchSource(includes, excludes);

request.source(sourceBuilder);
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:"    + response.isTimedOut());
System.out.println("total:" +    hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
//输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
  • consulta booleana
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");

// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 必须包含
boolQueryBuilder.must (QueryBuilders.matchQuery("age", "30"));
// 一定不含
boolQueryBuilder.mustNot (QueryBuilders.matchQuery("name", "zhangsan"));
// 可能包含
boolQueryBuilder.should (QueryBuilders.matchQuery("sex", "男"));

sourceBuilder.query(boolQueryBuilder);
request.source(sourceBuilder);
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:"    + response.isTimedOut());
System.out.println("total:" +    hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
//输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<<========");
  • consulta de rango
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
// 大于等于
rangeQuery.gte("30");
// 小于等于
rangeQuery.lte("40");
sourceBuilder.query(rangeQuery);
request.source(sourceBuilder);
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:" + response.isTimedOut());
System.out.println("total:" + hits.getTotalHits());
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
for (SearchHit hit : hits) {
    
    
//输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<<========");
● 模糊查询
// 创建搜索请求对象
  SearchRequest request = new SearchRequest();
  request.indices("student");
  
  // 构建查询的请求体
  SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  
  sourceBuilder.query(QueryBuilders.fuzzyQuery("name","zhangsan").fuzziness(Fu
  zziness.ONE));
  request.source(sourceBuilder);
  SearchResponse response = client.search (request, RequestOptions.DEFAULT);
  // 查询匹配
  SearchHits hits = response.getHits();
  System.out.println("took:" + response.getTook());
  System.out.println("timeout:"    + response.isTimedOut());
  System.out.println("total:" +    hits.getTotalHits());
  System.out.println("MaxScore:" + hits.getMaxScore());
  System.out.println("hits========>>");
  for (SearchHit hit : hits) {
    
    
  //输出每条查询的结果信息
  System.out.println(hit.getSourceAsString());
  }

2) Consulta resaltada

// 高亮查询
SearchRequest request = new SearchRequest().indices("student"); //2.创建查询请求体构建器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //构建查询方式:高亮查询
TermsQueryBuilder termsQueryBuilder =
QueryBuilders.termsQuery("name","zhangsan");
//设置查询方式
sourceBuilder.query(termsQueryBuilder);
//构建高亮字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<font color='red'>");//设置标签前缀
highlightBuilder.postTags("</font>");//设置标签后缀
highlightBuilder.field("name");//设置高亮字段
//设置高亮构建对象
sourceBuilder.highlighter(highlightBuilder);
//设置请求体
request.source(sourceBuilder);
//3.客户端发送请求,获取响应对象
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
//4.打印响应结果
SearchHits hits = response.getHits();
System.out.println("took::"+response.getTook());
System.out.println("time_out::"+response.isTimedOut());
System.out.println("total::"+hits.getTotalHits());
System.out.println("max_score::"+hits.getMaxScore());
System.out.println("hits===>>");
for (SearchHit hit : hits) {
    
    
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
//打印高亮结果
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
System.out.println(highlightFields);
}

3) Consulta de agregación

  • edad máxima
// 高亮查询
SearchRequest request = new SearchRequest().indices("student");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.aggregation(AggregationBuilders.max("maxAge").field("age"));
//设置请求体
request.source(sourceBuilder);
//3.客户端发送请求,获取响应对象
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
//4.打印响应结果
SearchHits hits = response.getHits();
System.out.println(response);
● 分组统计
// 高亮查询
SearchRequest request = new SearchRequest().indices("student");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.aggregation(AggregationBuilders.terms("age_groupby").field("ag
e"));
//设置请求体
request.source(sourceBuilder);
//3.客户端发送请求,获取响应对象
SearchResponse response = client.search (request, RequestOptions.DEFAULT);
//4.打印响应结果
SearchHits hits = response.getHits();
System.out.println(response);

Supongo que te gusta

Origin blog.csdn.net/qq_41943900/article/details/131529693
Recomendado
Clasificación