Elasticsearch学习笔记

这篇博客详细介绍了Elasticsearch的基础操作,包括创建、删除索引,新增、修改、删除数据,批量操作,搜索查询,高亮显示,以及聚合查询。还涉及到使用Java与Elasticsearch的交互,如连接ES、数据的增删改查,以及集群环境的搭建和故障处理。同时提到了Elasticsearch的倒排索引原理和全文检索功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分页查询是在查询体内设置查询的当前位置与每页显示条数:

  1. 分页查询,查询并显示所有数据

{

    "query":{

        "match_all":{//全库查询

        }

    },

    "from"0,//查询从当前位置开始

    "size"2 //每页显示2条数据

}

  1. 分页查询-查询所有数据,并显示指定列

{

    "query":{//查询操作

        "match_all":{//全库查询

        }

    },

    "from"0,//查询起始位置

    "size"2,//每页显示条数

    "_source":["title","kinds"] //指定显示的列

}

3.8 查询排序

  1. 查询排序是在查询结果内指定排序列以及排序方式

{

    "query":{

        "match_all":{

        }

    },

    "from"0,

    "size"3,

    "sort":{//排序

        "price":{//排序列

            "order":"desc"//排序方式

        }

    }

}

  • 全文检索

ES将存入的文档进行分词操作,然后将其存入到倒排索引中,检索是根据倒排索引内的关键字匹配文档。

如果在查询时,向完全匹配查询的结果,那么条件中的match关键字应换为match_phrase

4.1高亮显示的设置

如果想将查询结果中的某些列高亮显示,需要进行如下设置:

高亮结果设置:

  • 聚合操作

聚合操作使用aggs进行

分组操作请求正文:

{

    "aggs": { //聚合操作

        "price_group": { //名称,自定义

            "term": { //分组

                "field""price" //分组字段

            }

        }

    }

}

以上方式会显示具体数据,如果不想显示具体数据可设置具体数据不显示

  1. 求平均值 使用avg,如果不想显示具体数据信息,需要设置size为0

常见的聚合函数:

标识

名称

用途

terms

分组

对查询数据进行分组操作

avg

求平均值

对查询数据求平均值

sum

求和

对查询数据进行求和处理

  • 映射关系

映射关系,主要用于ES控制是否需要分词等属性设置。映射关系的设置,通过请求正文中的properties属性设置

映射关系设置:

  1. 创建索引

  1. 创建索引结构信息

执行结果:

mapping中设置的信息可以使用Get查看

标识

名称

用途

值介绍

示例

index

表示是否能够被索引查询

设置是否能够作为查询条件查询

true:能被索引查询

false:不能被索引查询

例如:如果设置了name不能被索引查询那么如果name作为查询条件,是不能够查询到数据的

type

类型

如果某一列被设置了不能被分词,那么这一列如果作为查询条件时,需要全匹配

text:文本,可以被分词

keywords:不能被分词

例如:name设置了不可分词,那么查询时,需要使用全的名称来进行查询。比如张三,如果不支持分词需要使用完整的“张三”查询,而“张”则不被支持

  • JAVA与ES实现

添加依赖:

<dependencies>

<dependency>

<groupId>org.elasticsearch</groupId>

<artifactId>elasticsearch</artifactId>

<version>7.17.6</version>

</dependency>

<!-- elasticsearch客户端-->

<dependency>

<groupId>org.elasticsearch.client</groupId>

<artifactId>elasticsearch-rest-high-level-client</artifactId>

<version>7.17.6</version>

</dependency>

<!-- elasticsearch依赖log4j-->

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-api</artifactId>

<version>2.17.2</version>

</dependency>

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-core</artifactId>

<version>2.17.2</version>

</dependency>

<!-- jackson-databind-->

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version> 2.13.3</version>

</dependency>

<!-- 单元测试-->

<dependency>

<groupId>org.junit.jupiter</groupId>

<artifactId>junit-jupiter</artifactId>

<version>5.9.1</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>1.18.24</version>

</dependency>

</dependencies>

7.1 连接ES

//创建elasticsearch客户端

RestHighLevelClient restHighLevelClient = new RestHighLevelClient(

RestClient.builder(

new HttpHost(URL,PORT,"http")));

//关闭连接客户端

restHighLevelClient.close();

7.2 indices() .create方法创建索引创建索引

封装连接

public class EsConn {

private static final String URL="124.71.74.18";

private static final int PORT=9200;

public static RestHighLevelClient getConnection(){

//创建elasticsearch客户端

RestHighLevelClient restHighLevelClient = new RestHighLevelClient(

RestClient.builder(

new HttpHost(URL,PORT,"http")));

return restHighLevelClient;

}

}

以下所有示例均使用封装的工具类获取连接对象

使用indices() .create创建索引

RestHighLevelClient connection = EsConn.getConnection();//获取连接对象

//获取创建索引请求对象

CreateIndexRequest indexRequest = new CreateIndexRequest("sys_user");//创建一个创建索引请求对象

CreateIndexResponse response = connection

.indices()

.create(indexRequest, RequestOptions.DEFAULT);//创建索引,RequestOptions为默认选项

boolean acknowledged = response.isAcknowledged();//响应状态,创建成功会返回true

//关闭连接客户端

restHighLevelClient.close();

7.3 indices().delete方法删除索引

使用indices().delete方法删除索引

RestHighLevelClient connection = EsConn.getConnection();

//创建请求对象

DeleteIndexRequest sys_user = new DeleteIndexRequest("sys_user");

//

AcknowledgedResponse delete = connection.indices().delete(sys_user, RequestOptions.DEFAULT);

boolean acknowledged = delete.isAcknowledged();//获取响应结果,删除成功返回true

//关闭连接客户端

restHighLevelClient.close();

7.4 indices().get方法查询索引

使用indices()对象的get方法获取索引

RestHighLevelClient connection = EsConn.getConnection();

//创建一个获取索引的对象

GetIndexRequest getIndexRequest = new GetIndexRequest("user");

GetIndexResponse response = connection

.indices()

.get(getIndexRequest, RequestOptions.DEFAULT);

System.out.println(response.getAliases());//别名操作

System.out.println(response.getDataStreams());

System.out.println(response.getIndices());

System.out.println(response.getDefaultSettings());

System.out.println(response.getMappings());

System.out.println(response.getSettings());

connection.close();

7.5 index方法新增数据

使用连接对象的index方法插入数据

ObjectMapper objectMapper = new ObjectMapper();

RestHighLevelClient connection = EsConn.getConnection();

IndexRequest indexRequest = new IndexRequest("sys_user");

// 设置id

indexRequest.id("10001");

User user = new User();

user.setName("张三");

user.setSex(true);

user.setAge(18);

user.setTel("120");

//Es中以JSON格式存储

String userJson = objectMapper.writeValueAsString(user);//将对象转换为json字符串

IndexRequest source = indexRequest.source(userJson, XContentType.JSON);

IndexResponse response = connection.index(indexRequest, RequestOptions.DEFAULT);

//写入ES结果

System.out.println(response.getResult());//获取ES的状态CREATED 创建成功,UPDATED 更新,DELETED 删除

System.out.println(response.getId());//获取数据id

System.out.println(response.getShardId());//获取分片id

System.out.println(response.getShardInfo());//获取分片信息

System.out.println(response.getIndex());

System.out.println(response.getVersion());

System.out.println(response.getSeqNo());

System.out.println(response.getType());

System.out.println(response.getPrimaryTerm());

7.6 update方法修改数据

使用连接对象的update方法修改

RestHighLevelClient connection = EsConn.getConnection();

//获取索引

UpdateRequest updateRequest = new UpdateRequest();//创建更新索引请求对象

UpdateRequest userIndex = updateRequest.index("sys_user");//设置索引

userIndex.id("10001");

updateRequest.doc(XContentType.JSON, "age", 20);

UpdateResponse response = connection.update(updateRequest, RequestOptions.DEFAULT);

System.out.println(response.getResult());//修改完成返回UPDATED

connection.close();

7.7 delete方法删除数据

使用连接对象的delete方法删除

RestHighLevelClient connection = EsConn.getConnection();

DeleteRequest deleteRequest = new DeleteRequest();

deleteRequest.index("sys_user");

deleteRequest.id("10001");

//以上两步合并后:deleteRequest.index("sys_user").id("10001");

DeleteResponse response = connection.delete(deleteRequest, RequestOptions.DEFAULT);

System.out.println(response.getResult());//删除失败返回NOT_FOUND,删除成功返回DELETED

connection.close();

7.8 bulk方法批量操作

7.8.1实现批量新增

实现原理:将要新增的IndexRequest对象逐一添加到BulkRequest中去再通过bulk执行批量新增

使用bulk实现批量插入

RestHighLevelClient connection = EsConn.getConnection();

BulkRequest bulkRequest = new BulkRequest();

//new IndexRequest().index("sys_user").id("10002").source(XContentType.JSON,"name","lisi");

bulkRequest.add(new IndexRequest().index("sys_user").id("10002").source(XContentType.JSON,"name","lisi"));

bulkRequest.add(new IndexRequest().index("sys_user").id("10003").source(XContentType.JSON,"name","lisi"));

bulkRequest.add(new IndexRequest().index("sys_user").id("10004").source(XContentType.JSON,"name","lisi"));

bulkRequest.add(new IndexRequest().index("sys_user").id("10005").source(XContentType.JSON,"name","lisi"));

bulkRequest.add(new IndexRequest().index("sys_user").id("10006").source(XContentType.JSON,"name","lisi"));

BulkResponse response = connection.bulk(bulkRequest, RequestOptions.DEFAULT);

System.out.println(response.getIngestTook());

System.out.println(response.getItems());

System.out.println(response.getTook());

System.out.println(response.getIngestTookInMillis());

connection.close();

7.8.2 实现批量删除

实现原理:将删除数据的DeleteRequest对象逐一添加到BulkRequest对象中再通过bulk执行批量删除

RestHighLevelClient connection = new RestHighLevelClient(RestClient

.builder(new HttpHost(URL,PORT)));

BulkRequest bulkRequest = new BulkRequest();

bulkRequest.add(new DeleteRequest().index("sys_user").id("10001"));

bulkRequest.add(new DeleteRequest().index("sys_user").id("10002"));

bulkRequest.add(new DeleteRequest().index("sys_user").id("10003"));

BulkResponse responses = connection.bulk(bulkRequest, RequestOptions.DEFAULT);

System.out.println(responses.getTook());

System.out.println(responses.getItems());

connection.close();

7.9 search方法全量查询

原理:

  1. 创建连接对象
  2. 创建SearchRequest对象,并使用indices设置查询的索引
  3. 构造查询条件
  1. 通过SearchRequest对象的source方法来构建查询条件
  2. source方法需要一个SearchSourceBuilder对象,该对象通过其query方法获取
  3. query中QueryBuilders类获取查询条件,例如匹配查询所有数据matchAllQuery()
  1. 调用连接对象的search方法执行查询
  2. 通过search方法所返回的对象获取查询结果

query方法中选择matchAllQuery()是查询所有

RestHighLevelClient connection = EsConn.getConnection();

//查询请求

SearchRequest searchRequest = new SearchRequest();

searchRequest.indices("sys_user");

//SearchSourceBuilder

SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());

//构造查询条件

searchRequest.source(query);

SearchResponse response = connection.search(searchRequest, RequestOptions.DEFAULT);

//获取查询结果

SearchHits hits = response.getHits();

//获取查询条数

TotalHits totalHits = hits.getTotalHits();

TimeValue took = response.getTook();

//

SearchHit[] hits1 = hits.getHits();

System.out.println("totalHits"+totalHits);

System.out.println("took"+took);

System.out.println("hits"+hits);

System.out.println("hits1"+hits1);

List<SearchHit> collect = Arrays.stream(hits1).collect(Collectors.toList());

System.out.println("collect"+collect);

connection.close();

条件查询使用:termQuery

RestHighLevelClient connection = EsConn.getConnection();

SearchRequest searchRequest = new SearchRequest();

searchRequest.indices("sys_user");

SearchSourceBuilder query = new SearchSourceBuilder()

.query(QueryBuilders

//条件查询

.termQuery("name","zhangsan"));

searchRequest.source(query);

SearchResponse response = connection.search(searchRequest, RequestOptions.DEFAULT);

SearchHits hits = response.getHits();

SearchHit[] hits1 = hits.getHits();

if(hits1.length==0){

System.out.println("未查询到数据");

return;

}

else {

List<SearchHit> collect = Arrays.stream(hits1).collect(Collectors.toList());

System.out.println(collect);

}

//释放资源

connection.close();

QueryBuilders中的方法

方法标识

方法名称

用途

示例

matchAllQuery

匹配所有查询

查询全索引内数据

termQuery

 

条件查询(7个重载方法)

  • 介绍

Elasticsearch是一款分布式、高扩展、高实时的搜索与数据分析引擎,为所有类型的数据提供近乎实时的搜索和分析,支持RESTful风格

RESTful,REST表示资源状态转换,例如HTTP协议就遵循了这个协议

Elasticsearch也是一个面向文档型的数据库,其内的Index(索引)可以看做是一个库,Type(类型)相当于表,Type的概念已逐渐被弱化,在7.X后被移除,Documents(文档)相当于表的行,Fields(字段)相当于列

倒排索引:根据关键字查询主键ID然后在关联文档内容

正排(正向)索引:根据主键索引查询文档内容然后再检索关键字

  • 介绍

Elasticsearch是一款分布式、高扩展、高实时的搜索与数据分析引擎,为所有类型的数据提供近乎实时的搜索和分析,支持RESTful风格

RESTful,REST表示资源状态转换,例如HTTP协议就遵循了这个协议

Elasticsearch也是一个面向文档型的数据库,其内的Index(索引)可以看做是一个库,Type(类型)相当于表,Type的概念已逐渐被弱化,在7.X后被移除,Documents(文档)相当于表的行,Fields(字段)相当于列

倒排索引:根据关键字查询主键ID然后在关联文档内容

正排(正向)索引:根据主键索引查询文档内容然后再检索关键字

  • 安装

1.1 基于docker环境的elasticsearch的安装

1.1.1常规安装

  1. 拉取镜像
  2. 创建挂载文件
  1. 创建配置文件目录:mkdir -p /elasticsearch/confi
  2. 创建data文件目录:mkdir -p /elasticsearch/data
  3. 创建log文件目录:mkdir -p /elasticsearch/log
  1. 在confi中创建elasticsearch.yml文件

设置: http.host:0.0.0.0

  1. 使用docker run -d -p命令运行

docker run -d -p 9200:9200 -p 9300:9300 --name es\

-e "discovery.type=single-node"\

-e ES_JAVA_OPTS="-Xms512m -Xmx512m"\

-v /usr/local/bin/elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml\

-v /usr/local/bin/elasticsearch/data:/usr/share/data\

-v /usr/local/bin/elasticsearch/plugins:/usr/share/elasticsearch/plugins\

-d elasticsearch:7.17.4

  1. 进入容器:docker exec -it 容器名 bash
  2. 安装分词器:

./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.4/elasticsearch-analysis-ik-7.17.4.zip

如果./elasticsearch-plugin提示找不到这个命令,则直接使用elasticsearch-plugin运行

 

 

1.1.2使用docker-compose的安装与配置

  1. 拉取镜像文件
  2. 下载docker-compose,并赋予权限
  3. 配置docker-compose.yml文件

详情参考:docker-compose.yml文件配置:

docker-compose.yml文件配置:

version: "3.1"
services:
  elasticsearch:
    image: elasticsearch:7.17.4
    # restart: always # 总是重启,服务挂了后会自动重启。如果有问题的话会一直重启
    container_name: elasticsearch
    environment: #可以在elasticsearch.yml文件中配置
      - node.name=elasticsearch #设置节点名称
      - cluster.name=es-docker-cluster #设置集群名称
      - discovery.seed_hosts=es01
      - discovery.type=single-node #以单节点模式启动
      # - cluster.initial_master_nodes=elasticsearch  #集群名称,节点模式是单节点模式不配置该项
      - ES_JAVA_OPTS=-Xms512m -Xmx512m    # 设置jvm内存使用大小
    ports:
      - 9200:9200
      - 9300:9300
    volumes:
      - ./elasticsearch/plugins:/usr/share/elasticsearch/plugins # 插件文件挂载
      #- ./elasticsearch/data:/usr/share/elasticsearch/data # 数据文件挂载
      #- ./elasticsearch/log:/user/share/elasticsearch/logs # 日志

  kibana:
    image: kibana:8.4.1
    restart: always
    container_name: kibana
    ports:
      - 5601:5601
    environment:
      - elasticsearch_url=http://IP:PORT //自行更改
    depends_on:
      - elasticsearch

基础操作

3.1 创建Index

使用PUT方法访问ES,会自动创建一个Index。Index相当于一个表。

PUT方法请求具有幂等性!

  1. 使用PUT请求创建Index:

 

 

3.2 获取索引

获取索引使用GET方法进行请求

  1. 索引的获取,使用GET方法:

  1. 查所有索引信息:在请求地址后使用:_cat/indices?v

3.3 删除索引

删除索引使用DELETE方法请求

删除索引,使用DELETE请求

索引删除成功后使用GET请求将不能再获取

索引删除后还可以使用相同名称创建

 

3.3 添加文档数据

添加文档数据使用POST请求,POST不是幂等性的。注意:下表内绿色的部分可根据实际情况进行替换。并且_doc 可以改为_create

  1. 使用POST添加文档数据:http://ip:port/indexName/_doc

在_doc后不指定ID的话ES会自动生成一个随机的ID作为本次添加数据的ID

  1. 使用POST指定ID添加数据:http://ip:port/indexName/_doc/id

  1. 同一个ID再次执行新增操作,ES判断为更新,操作。每更新一次,版本加1

  1. 数据新增可以使用PUT请求:http://ip:port/indexName/_doc/id或 http://ip:port/indexName/_doc

  1. 使用_create增加数据:同一个ID第一次能够正常创建,第二次会出现创建异常

http://ip:port/indexName/_create/id

第二次使用同一个ID创建异常:

注意事项:

1. 使用_create添加数据,无论put还是post只能执行1次,否则会出现异常

2. 使用_doc添加数据,第一次添加是创建,第二次添加是更新 (无论POST与PUT)

3.3 数据查询

查询使用GET方法请求,在索引名称后使用_doc

  1. 查询指定索引中的指定id的数据:http://ip:port/indexName/_doc/id

  1. 查询一个不存在的数据,会返回一个false结果:

  1. 获取指定索引下的所有数据:使用_search:http://ip:port/indexName/_search

 

3.4 修改

3.4.1完全覆盖的修改

可以使用PUT或者POST请求,配置_doc实现完全覆盖的修改,建议使用PUT

  1. 根据指定的id修改:http://ip:port/indexName/_doc/id

 

3.4.2 局部数据更新

局部更新使用POST,配置_update实现。更新时,指定更新部分即可

  1. 根据指定的id修改:http://ip:port/indexName/_doc/id

修改是需要设置报文:

{

    "doc":{

         "title""XX电脑" //要修改的对象,已经修改的值

    }

}

修改前:

6e9577147d9cfa628e24fd2616099f7d.png

修改后

4f468b28ea56b4ebc83596829c078d47.png

3.5 删除

数据的删除使用DELETE请求,资源地址不变:http://ip:port/indexName/_doc/id。

删除后的数据再执行删除会提示找不到

多次删除,删除失败:

98bcc9dac61b2f005e44f7ad16fdecb7.png

3.6 条件查询

条件查询使用GET方法,配合_search使用,在其后跟上:?q= 字段:值

  1. 使用GET请求,配合_search进行条件查询,语法格式如下:

http:// ip:port/_search?q=条件字段:字段值

通过请求路径进行查询

7e21f78e0633365630aecc0cbc574116.png

  1. 使用get通过请求体进行查询:

{

    "query":{ //查询操作

        "match":{//查询类型-匹配查询

           "title":"小米" //查询条件

        }

    }

}

  1. 使用_search以请求体方式进行全量查询

{

    "query":{ //查询操作

        "match_all":{//查询类型-全量查询

        }

    }

}

  1. must 查询,是指查询中的所有查询条件都满足的情况下查询数据

{

    "query":{ //查询

        "bool":{

            "must":[ //must查询,一下所有条件都必须是true

                {//条件1

                "match"://匹配查询

                    {

                        "title":"手机"

                    } 

            },

            {//条件2

                "match"://匹配查询

                    {

                        "category":"小米"

                    } 

            }

            ]

        }

    }

}

  1. should 查询,是指查询满足查询条件其中一个的结果

{

    "query":{ //查询

        "bool":{

            "should":[ //should查询,以下所有条件只要有一个为true,即可

                {//条件1

                "match"://匹配查询

                    {

                        "title":"手机"

                    } 

            },

            {//条件2

                "match"://匹配查询

                    {

                        "category":"小米"

                    } 

            }

            ]

        }

    }

}

  1. 范围查询:filter 过滤

{

    "query":{

        "bool":{

            "should":[

                {

                "match":

                    {

                        "title":"手机"

                    } 

            },

            {

                "match":

                    {

                        "category":"电脑"

                    } 

            }

            ],

            "filter":{//范围查询

                "range":{//范围

                    "price":{//价格

                        "gt":1000//大于1000

                    }

                }

            }

        }

    }

}

3.7 分页查询

 

分页查询是在查询体内设置查询的当前位置与每页显示条数:

  1. 分页查询,查询并显示所有数据

{

    "query":{

        "match_all":{//全库查询

        }

    },

    "from"0,//查询从当前位置开始

    "size"2 //每页显示2条数据

}

  1. 分页查询-查询所有数据,并显示指定列

{

    "query":{//查询操作

        "match_all":{//全库查询

        }

    },

    "from"0,//查询起始位置

    "size"2,//每页显示条数

    "_source":["title","kinds"] //指定显示的列

}

3.8 查询排序

  1. 查询排序是在查询结果内指定排序列以及排序方式

{

    "query":{

        "match_all":{

        }

    },

    "from"0,

    "size"3,

    "sort":{//排序

        "price":{//排序列

            "order":"desc"//排序方式

        }

    }

}

  • 全文检索

ES将存入的文档进行分词操作,然后将其存入到倒排索引中,检索是根据倒排索引内的关键字匹配文档。

如果在查询时,向完全匹配查询的结果,那么条件中的match关键字应换为match_phrase

4.1高亮显示的设置

如果想将查询结果中的某些列高亮显示,需要进行如下设置:

高亮结果设置:

  • 聚合操作

聚合操作使用aggs进行

分组操作请求正文:

{

    "aggs": { //聚合操作

        "price_group": { //名称,自定义

            "term": { //分组

                "field""price" //分组字段

            }

        }

    }

}

以上方式会显示具体数据,如果不想显示具体数据可设置具体数据不显示

  1. 求平均值 使用avg,如果不想显示具体数据信息,需要设置size为0

常见的聚合函数:

标识

名称

用途

terms

分组

对查询数据进行分组操作

avg

求平均值

对查询数据求平均值

sum

求和

对查询数据进行求和处理

  • 映射关系

映射关系,主要用于ES控制是否需要分词等属性设置。映射关系的设置,通过请求正文中的properties属性设置

映射关系设置:

  1. 创建索引

  1. 创建索引结构信息

执行结果:

mapping中设置的信息可以使用Get查看

标识

名称

用途

值介绍

示例

index

表示是否能够被索引查询

设置是否能够作为查询条件查询

true:能被索引查询

false:不能被索引查询

例如:如果设置了name不能被索引查询那么如果name作为查询条件,是不能够查询到数据的

type

类型

如果某一列被设置了不能被分词,那么这一列如果作为查询条件时,需要全匹配

text:文本,可以被分词

keywords:不能被分词

例如:name设置了不可分词,那么查询时,需要使用全的名称来进行查询。比如张三,如果不支持分词需要使用完整的“张三”查询,而“张”则不被支持

  • JAVA与ES实现

添加依赖:

<dependencies>

<dependency>

<groupId>org.elasticsearch</groupId>

<artifactId>elasticsearch</artifactId>

<version>7.17.6</version>

</dependency>

<!-- elasticsearch客户端-->

<dependency>

<groupId>org.elasticsearch.client</groupId>

<artifactId>elasticsearch-rest-high-level-client</artifactId>

<version>7.17.6</version>

</dependency>

<!-- elasticsearch依赖log4j-->

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-api</artifactId>

<version>2.17.2</version>

</dependency>

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-core</artifactId>

<version>2.17.2</version>

</dependency>

<!-- jackson-databind-->

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version> 2.13.3</version>

</dependency>

<!-- 单元测试-->

<dependency>

<groupId>org.junit.jupiter</groupId>

<artifactId>junit-jupiter</artifactId>

<version>5.9.1</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>1.18.24</version>

</dependency>

</dependencies>

7.1 连接ES

//创建elasticsearch客户端

RestHighLevelClient restHighLevelClient = new RestHighLevelClient(

RestClient.builder(

new HttpHost(URL,PORT,"http")));

//关闭连接客户端

restHighLevelClient.close();

7.2 indices() .create方法创建索引创建索引

封装连接

public class EsConn {

private static final String URL="124.71.74.18";

private static final int PORT=9200;

public static RestHighLevelClient getConnection(){

//创建elasticsearch客户端

RestHighLevelClient restHighLevelClient = new RestHighLevelClient(

RestClient.builder(

new HttpHost(URL,PORT,"http")));

return restHighLevelClient;

}

}

以下所有示例均使用封装的工具类获取连接对象

使用indices() .create创建索引

RestHighLevelClient connection = EsConn.getConnection();//获取连接对象

//获取创建索引请求对象

CreateIndexRequest indexRequest = new CreateIndexRequest("sys_user");//创建一个创建索引请求对象

CreateIndexResponse response = connection

.indices()

.create(indexRequest, RequestOptions.DEFAULT);//创建索引,RequestOptions为默认选项

boolean acknowledged = response.isAcknowledged();//响应状态,创建成功会返回true

//关闭连接客户端

restHighLevelClient.close();

7.3 indices().delete方法删除索引

使用indices().delete方法删除索引

RestHighLevelClient connection = EsConn.getConnection();

//创建请求对象

DeleteIndexRequest sys_user = new DeleteIndexRequest("sys_user");

//

AcknowledgedResponse delete = connection.indices().delete(sys_user, RequestOptions.DEFAULT);

boolean acknowledged = delete.isAcknowledged();//获取响应结果,删除成功返回true

//关闭连接客户端

restHighLevelClient.close();

7.4 indices().get方法查询索引

使用indices()对象的get方法获取索引

RestHighLevelClient connection = EsConn.getConnection();

//创建一个获取索引的对象

GetIndexRequest getIndexRequest = new GetIndexRequest("user");

GetIndexResponse response = connection

.indices()

.get(getIndexRequest, RequestOptions.DEFAULT);

System.out.println(response.getAliases());//别名操作

System.out.println(response.getDataStreams());

System.out.println(response.getIndices());

System.out.println(response.getDefaultSettings());

System.out.println(response.getMappings());

System.out.println(response.getSettings());

connection.close();

7.5 index方法新增数据

使用连接对象的index方法插入数据

ObjectMapper objectMapper = new ObjectMapper();

RestHighLevelClient connection = EsConn.getConnection();

IndexRequest indexRequest = new IndexRequest("sys_user");

// 设置id

indexRequest.id("10001");

User user = new User();

user.setName("张三");

user.setSex(true);

user.setAge(18);

user.setTel("120");

//Es中以JSON格式存储

String userJson = objectMapper.writeValueAsString(user);//将对象转换为json字符串

IndexRequest source = indexRequest.source(userJson, XContentType.JSON);

IndexResponse response = connection.index(indexRequest, RequestOptions.DEFAULT);

//写入ES结果

System.out.println(response.getResult());//获取ES的状态CREATED 创建成功,UPDATED 更新,DELETED 删除

System.out.println(response.getId());//获取数据id

System.out.println(response.getShardId());//获取分片id

System.out.println(response.getShardInfo());//获取分片信息

System.out.println(response.getIndex());

System.out.println(response.getVersion());

System.out.println(response.getSeqNo());

System.out.println(response.getType());

System.out.println(response.getPrimaryTerm());

7.6 update方法修改数据

使用连接对象的update方法修改

RestHighLevelClient connection = EsConn.getConnection();

//获取索引

UpdateRequest updateRequest = new UpdateRequest();//创建更新索引请求对象

UpdateRequest userIndex = updateRequest.index("sys_user");//设置索引

userIndex.id("10001");

updateRequest.doc(XContentType.JSON, "age", 20);

UpdateResponse response = connection.update(updateRequest, RequestOptions.DEFAULT);

System.out.println(response.getResult());//修改完成返回UPDATED

connection.close();

7.7 delete方法删除数据

使用连接对象的delete方法删除

RestHighLevelClient connection = EsConn.getConnection();

DeleteRequest deleteRequest = new DeleteRequest();

deleteRequest.index("sys_user");

deleteRequest.id("10001");

//以上两步合并后:deleteRequest.index("sys_user").id("10001");

DeleteResponse response = connection.delete(deleteRequest, RequestOptions.DEFAULT);

System.out.println(response.getResult());//删除失败返回NOT_FOUND,删除成功返回DELETED

connection.close();

7.8 bulk方法批量操作

7.8.1实现批量新增

实现原理:将要新增的IndexRequest对象逐一添加到BulkRequest中去再通过bulk执行批量新增

使用bulk实现批量插入

RestHighLevelClient connection = EsConn.getConnection();

BulkRequest bulkRequest = new BulkRequest();

//new IndexRequest().index("sys_user").id("10002").source(XContentType.JSON,"name","lisi");

bulkRequest.add(new IndexRequest().index("sys_user").id("10002").source(XContentType.JSON,"name","lisi"));

bulkRequest.add(new IndexRequest().index("sys_user").id("10003").source(XContentType.JSON,"name","lisi"));

bulkRequest.add(new IndexRequest().index("sys_user").id("10004").source(XContentType.JSON,"name","lisi"));

bulkRequest.add(new IndexRequest().index("sys_user").id("10005").source(XContentType.JSON,"name","lisi"));

bulkRequest.add(new IndexRequest().index("sys_user").id("10006").source(XContentType.JSON,"name","lisi"));

BulkResponse response = connection.bulk(bulkRequest, RequestOptions.DEFAULT);

System.out.println(response.getIngestTook());

System.out.println(response.getItems());

System.out.println(response.getTook());

System.out.println(response.getIngestTookInMillis());

connection.close();

7.8.2 实现批量删除

实现原理:将删除数据的DeleteRequest对象逐一添加到BulkRequest对象中再通过bulk执行批量删除

RestHighLevelClient connection = new RestHighLevelClient(RestClient

.builder(new HttpHost(URL,PORT)));

BulkRequest bulkRequest = new BulkRequest();

bulkRequest.add(new DeleteRequest().index("sys_user").id("10001"));

bulkRequest.add(new DeleteRequest().index("sys_user").id("10002"));

bulkRequest.add(new DeleteRequest().index("sys_user").id("10003"));

BulkResponse responses = connection.bulk(bulkRequest, RequestOptions.DEFAULT);

System.out.println(responses.getTook());

System.out.println(responses.getItems());

connection.close();

7.9 search方法全量查询

原理:

  1. 创建连接对象
  2. 创建SearchRequest对象,并使用indices设置查询的索引
  3. 构造查询条件
  1. 通过SearchRequest对象的source方法来构建查询条件
  2. source方法需要一个SearchSourceBuilder对象,该对象通过其query方法获取
  3. query中QueryBuilders类获取查询条件,例如匹配查询所有数据matchAllQuery()
  1. 调用连接对象的search方法执行查询
  2. 通过search方法所返回的对象获取查询结果

query方法中选择matchAllQuery()是查询所有

RestHighLevelClient connection = EsConn.getConnection();

//查询请求

SearchRequest searchRequest = new SearchRequest();

searchRequest.indices("sys_user");

//SearchSourceBuilder

SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());

//构造查询条件

searchRequest.source(query);

SearchResponse response = connection.search(searchRequest, RequestOptions.DEFAULT);

//获取查询结果

SearchHits hits = response.getHits();

//获取查询条数

TotalHits totalHits = hits.getTotalHits();

TimeValue took = response.getTook();

//

SearchHit[] hits1 = hits.getHits();

System.out.println("totalHits"+totalHits);

System.out.println("took"+took);

System.out.println("hits"+hits);

System.out.println("hits1"+hits1);

List<SearchHit> collect = Arrays.stream(hits1).collect(Collectors.toList());

System.out.println("collect"+collect);

connection.close();

条件查询使用:termQuery

RestHighLevelClient connection = EsConn.getConnection();

SearchRequest searchRequest = new SearchRequest();

searchRequest.indices("sys_user");

SearchSourceBuilder query = new SearchSourceBuilder()

.query(QueryBuilders

//条件查询

.termQuery("name","zhangsan"));

searchRequest.source(query);

SearchResponse response = connection.search(searchRequest, RequestOptions.DEFAULT);

SearchHits hits = response.getHits();

SearchHit[] hits1 = hits.getHits();

if(hits1.length==0){

System.out.println("未查询到数据");

return;

}

else {

List<SearchHit> collect = Arrays.stream(hits1).collect(Collectors.toList());

System.out.println(collect);

}

//释放资源

connection.close();

QueryBuilders中的方法

方法标识

方法名称

用途

示例

matchAllQuery

匹配所有查询

查询全索引内数据

termQuery

条件查询(7个重载方法)

7.9.1 排序

排序是在查询的基础上进行的,全量查询中的排序与分页一样都是在SearchSourceBuilder对象中进行设置。

原理:

  1. 创建连接对象
  2. 创建SearchRequest对象,并使用indices设置查询的索引
  3. 构造查询条件
  1. 通过SearchRequest对象的source方法来构建查询条件
  2. source方法需要一个SearchSourceBuilder对象,该对象通过其query方法获取
  3. query中QueryBuilders类获取查询条件,例如匹配查询所有数据matchAllQuery()
  4. 通过query方法返回的结果设置排序规则,query方法返回的结果是SearchSourceBuilder对象
  1. 调用连接对象的search方法执行查询
  2. 通过search方法所返回的对象获取查询结果

详细代码可参考分页查询

7.9.2 排除与包含

排除与包含的原理同上边介绍的类似,都是在SearchSourceBuilder对象中设置需要排除与包含的内容。以下截取了部分代码,其他代码可参考分页查询

7.10 分页查询

分页查询的原理类似全量查询,主要是在构造查询条件的地方设置了分页属性具体见下表

原理:

  1. 创建连接对象
  2. 创建SearchRequest对象,并使用indices设置查询的索引
  3. 构造查询条件
  1. 通过SearchRequest对象的source方法来构建查询条件
  2. source方法需要一个SearchSourceBuilder对象,该对象通过其query方法获取
  3. query中QueryBuilders类获取查询条件,例如匹配查询所有数据matchAllQuery()
  4. 通过query方法返回的结果设置分页属性,form、size’,query方法返回的结果是SearchSourceBuilder对象
  1. 调用连接对象的search方法执行查询
  2. 通过search方法所返回的对象获取查询结果

示例:

RestHighLevelClient connection = EsConn.getConnection();

//查询请求

SearchRequest searchRequest = new SearchRequest();

searchRequest.indices("sys_user");

//SearchSourceBuilder

SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());

//设置分页查询属性

query.from(0);//当前数据位置

query.size(2);//每页显示条数

//构造查询条件

searchRequest.source(query);

SearchResponse response = connection.search(searchRequest, RequestOptions.DEFAULT);

//获取查询结果

SearchHits hits = response.getHits();

//获取查询条数

TotalHits totalHits = hits.getTotalHits();

SearchHit[] hits1 = hits.getHits();

List<SearchHit> collect = Arrays.stream(hits1).collect(Collectors.toList());

System.out.println("collect"+collect);

connection.close();

7.11 组合查询与范围查询

7.11.1 组合查询

组合查询的基本原理与分页查询类似,不同的地方在于需要在QueryBuilds对象中设置组合查询条件

原理:

  1. 创建连接对象
  2. 创建SearchRequest对象,并使用indices设置查询的索引
  3. 构造查询条件
  1. 通过QueryBuilders类中的boolQuery方法创建BoolQueryBuilder对象
  2. 在BoolQueryBuilder对象内设置must属性,参数值同样适用QueryBuilders类中的方法设置,例如设置matchQuery
  3. 创建SearchSourceBuilder对象,并通过该对象调用query方法,query方法的参数是BoolQueryBuilder对象
  1. 调用连接对象的search方法执行查询
  2. 通过search方法所返回的对象获取查询结果

7.11.2 范围查询

原理:

  1. 创建连接对象
  2. 创建SearchRequest对象,并使用indices设置查询的索引
  3. 构造查询条件
  1. 通过QueryBuilders类中的rangeQuery方法创建BoolQueryBuilder对象
  2. 在BoolQueryBuilder对象内设置must属性,参数值同样适用QueryBuilders类中的方法设置,例如设置matchQuery
  3. 创建SearchSourceBuilder对象,并通过该对象调用query方法,query方法的参数是BoolQueryBuilder对象
  1. 调用连接对象的search方法执行查询
  2. 通过search方法所返回的对象获取查询结果

其他代码参考分页查询

标识

名称

gte

大于等于

lte

小于等于

gt

大于

lt

小于

7.12 模糊查询与高亮查询

7.12.1 fuzzyQuery模糊查询

原理:

  1. 创建连接对象
  2. 创建SearchRequest对象,并使用indices设置查询的索引
  3. 构造查询条件
  1. 通过QueryBuilders类中的fuzzyQuery方法创建BoolQueryBuilder对象
  2. 在BoolQueryBuilder对象内设置must属性,参数值同样适用QueryBuilders类中的方法设置,例如设置matchQuery
  3. 创建SearchSourceBuilder对象,并通过该对象调用query方法,query方法的参数是BoolQueryBuilder对象
  1. 调用连接对象的search方法执行查询
  2. 通过search方法所返回的对象获取查询结果

7.12.2 高亮展示

//1. 获取连接对象

RestHighLevelClient connection = new RestHighLevelClient(RestClient

.builder(new HttpHost(URL, PORT)));//获取连接对象

//2. 创建查询请求体构造器

SearchRequest searchRequest = new SearchRequest();

searchRequest.indices("sys_user");//要查询的索引

//3. 构造查询条件

TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "");

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

//设置查询方式

sourceBuilder.query(termQueryBuilder);

//构造高亮显示

HighlightBuilder highlightBuilder = new HighlightBuilder();

highlightBuilder.preTags("<font color='red'>");//设置标签前置

highlightBuilder.postTags("</font>");//设置后置标签

highlightBuilder.field("name");//设置高亮显示字段

//设置高亮显示对象

sourceBuilder.highlighter(highlightBuilder);

//设置请求体

searchRequest.source(sourceBuilder);

//ES响应

SearchResponse response = connection.search(searchRequest, RequestOptions.DEFAULT);

SearchHits hits = response.getHits();//获取命中数据

SearchHit[] hits1 = hits.getHits();

List<SearchHit> collect = Arrays.stream(hits1).collect(Collectors.toList());

System.out.println(collect);

connection.close();

7.13 最大值查询与分组查询

最大值与分组查询是属于聚合查询范畴,

原理:

  1. 创建连接对象
  2. 创建查询请求体SearchRequest对象,并使用indices设置查询的索引
  3. 构造查询条件
  1. 通过AggregationBuilders类提供的聚合函数方法创建对应聚合函数对象对象
  2. 创建SearchSourceBuilder对象,并通过该对象调用aggregation方法,aggregation方法的参数是AggregationBuilders对应聚合函数的结果对象
  3. 设置请求体,将SearchSourceBuilder对象通过请求对象的source方法包装到该对象中去
  1. 调用连接对象的search方法执行查询
  2. 通过search方法所返回的对象获取查询结果

===========================后续补充=====================
  • 高级篇

8.1 集群环境搭建

8.1.1 windows环境集群部署

8.2.2 linux环境集群部署

8.2.3 linux单节点部署

8.2 系统架构

8.3 故障处理与扩容

8.3.1 故障转移

8.3.2 应对故障

8.3.3 水平扩容

8.4 路由计算与分片控制

8.5 更新流程与批量操作流程

8.6 倒排索引

8.7 文档搜索

8.8 文档刷新、文档刷写、文档合并

8.9 文档分析

8.10 文档展示

  • 框架集成

9.1 集成SpringData

9.2 集成SparkStreaming

9.3 集成Flink

  • 优化

10.1 硬件选择

10.2 分片策略

10.3 路由选择

10.4 写入速度优化

10.5 内存设置

10.6 重要配置

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值