使用java操作ElasticSearch数据

一、环境配置

导入依赖:

  • 创建一个springboot项目
<properties>
    <java.version>17</java.version>
    <!--自定义版本依赖-->
    <elasticsearch.version>7.6.1</elasticsearch.version>
</properties>
<!--elasticsearch依赖包-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!--方便转换json数据-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.5</version>
</dependency>

创建elasticsearch配置类:

package com.kuang.config;/*
 *@program:kuang_es_api
 *@author: 小虎
 *@Time: 2022/8/26  16:14
 *@description: ElasticSearchClient
 *@version 1.0.0
 */
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * spring步骤:
 *      1.找对象
 *      2.放到spring待用
 *      3.如果是springBoot 就先分析源码
 *   xxxxAutoConfiguation  xxxxProperties
 */
@Configuration//该类为配置文件
public class ElasticSearchClientConfig {
    /**
     * 类似spring   <bean id="restHighLevelClient" class="RestHighLevelClient"></bean>
     * @return
     */
    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                new HttpHost("127.0.0.1",9200,"http")));
        return client;
    }
}

内容借鉴狂神说

二、编写测试类

注入 RestHighLevelClient

@Autowired
public RestHighLevelClient restHighLevelClient;

索引的操作

1.创建索引:
/**
     * 创建一个索引hong_index,字段为user、message、postDate
     * @throws IOException
     */
    @Test
    public void testcreateIndexAsAPI() throws IOException {
        //创建一个创建索引的请求对象indexRequest
        IndexRequest indexRequest = new IndexRequest("hong_index");
        String jsonString = null;
        for (int i = 20; i < 100; i++) {
            indexRequest.id("100"+i);
             jsonString = "{" +
                    "\"user\":\"李星云"+i+"\"," +
                    "\"postDate\":\"2060-01-30\"," +
                    "\"message\":\"不良帅"+i+"\"" +
                    "}";
            indexRequest.source(jsonString, XContentType.JSON);
            //客户端发送一个创建索引的请求并得到一个响应结果indexResponse
            IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
            System.out.println("查看响应结果:"+indexResponse.status());
            System.out.println("index:"+indexResponse);
        }
    }

2.获取索引、并判断索引是否存在:

/**
     * 从hong_index索引获取id为1009的数据
     * @throws IOException
     */
    @Test
    void testGetIndexAsAPI() throws IOException {
        GetRequest getRequest = new GetRequest("hong_index","1009");
        boolean exists = client.exists(getRequest,RequestOptions.DEFAULT);
        System.out.println("返回结果:"+exists);
        GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
        System.out.println("遍历结果集:"+documentFields.getSourceAsString());
        System.out.println(documentFields);
        client.close();
    }

3.删除索引

 /**
     * 删除一个id为10019的hong_index索引信息
     * @throws IOException
     */
    @Test
    public void testDeleteIndexAsAPI() throws IOException {
        DeleteRequest deleteRequest = new DeleteRequest("hong_index","10019");
        deleteRequest.timeout("2s");
        DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println("获取输出后的响应结果:"+deleteResponse.status());
        System.out.println(deleteResponse);
        client.close();
    }

文档的操作

1.添加文档(对应关系数据库的行)

// 测试添加文档(先创建一个User实体类,添加fastjson依赖)
@Test
public void testAddDocument() throws IOException {
    // 创建一个User对象
    User liuyou = new User("liuyou", 18);
    // 创建请求
    IndexRequest request = new IndexRequest("liuyou_index");
    // 制定规则 PUT /liuyou_index/_doc/1
    request.id("1");// 设置文档ID
    request.timeout(TimeValue.timeValueMillis(1000));// request.timeout("1s")
    // 将我们的数据放入请求中
    request.source(JSON.toJSONString(liuyou), XContentType.JSON);
    // 客户端发送请求,获取响应的结果
    IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
    System.out.println(response.status());// 获取建立索引的状态信息 CREATED
    System.out.println(response);// 查看返回内容 IndexResponse[index=liuyou_index,type=_doc,id=1,version=1,result=created,seqNo=0,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]
}

2.文档信息的获取

// 测试获得文档信息
@Test
public void testGetDocument() throws IOException {
    GetRequest request = new GetRequest("hong_index","1");
    GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
    System.out.println(response.getSourceAsString());// 打印文档内容
    System.out.println(request);// 返回的全部内容和命令是一样的
    restHighLevelClient.close();
}

3、文档的获取,并判断其是否存在

// 获取文档,判断是否存在 get /liuyou_index/_doc/1
@Test
public void testDocumentIsExists() throws IOException {
    GetRequest request = new GetRequest("liuyou_index", "1");
    // 不获取返回的 _source的上下文了
    request.fetchSourceContext(new FetchSourceContext(false));
    request.storedFields("_none_");
    boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
    System.out.println(exists);
}

3、文档的获取,并判断其是否存在

// 获取文档,判断是否存在 get /liuyou_index/_doc/1
@Test
public void testDocumentIsExists() throws IOException {
    GetRequest request = new GetRequest("liuyou_index", "1");
    // 不获取返回的 _source的上下文了
    request.fetchSourceContext(new FetchSourceContext(false));
    request.storedFields("_none_");
    boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
    System.out.println(exists);
}

4、文档的更新

// 测试更新文档内容
@Test
public void testUpdateDocument() throws IOException {
    UpdateRequest request = new UpdateRequest("liuyou_index", "1");
    User user = new User("lmk",11);
    request.doc(JSON.toJSONString(user),XContentType.JSON);
    UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
    System.out.println(response.status()); // OK
    restHighLevelClient.close();
}

5、文档的删除

// 测试删除文档
@Test
public void testDeleteDocument() throws IOException {
    DeleteRequest request = new DeleteRequest("liuyou_index", "1");
    request.timeout("1s");
    DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
    System.out.println(response.status());// OK
}

6、文档的查询

// 查询
// SearchRequest 搜索请求
// SearchSourceBuilder 条件构造
// HighlightBuilder 高亮
// TermQueryBuilder 精确查询
// MatchAllQueryBuilder
// xxxQueryBuilder ...
@Test
public void testSearch() throws IOException {
    // 1.创建查询请求对象
    SearchRequest searchRequest = new SearchRequest();
    // 2.构建搜索条件
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    // (1)查询条件 使用QueryBuilders工具类创建
    // 精确查询
    TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "liuyou");
    //        // 匹配查询
    //        MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
    // (2)其他<可有可无>:(可以参考 SearchSourceBuilder 的字段部分)
    // 设置高亮
    searchSourceBuilder.highlighter(new HighlightBuilder());
    //        // 分页
    //        searchSourceBuilder.from();
    //        searchSourceBuilder.size();
    searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    // (3)条件投入
    searchSourceBuilder.query(termQueryBuilder);
    // 3.添加条件到请求
    searchRequest.source(searchSourceBuilder);
    // 4.客户端查询请求
    SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    // 5.查看返回结果
    SearchHits hits = search.getHits();
    System.out.println(JSON.toJSONString(hits));
    System.out.println("=======================");
    for (SearchHit documentFields : hits.getHits()) {
        System.out.println(documentFields.getSourceAsMap());
    }
}

前面的操作都无法批量添加数据

// 上面的这些api无法批量增加数据(只会保留最后一个source)
@Test
public void test() throws IOException {
    IndexRequest request = new IndexRequest("bulk");// 没有id会自动生成一个随机ID
    request.source(JSON.toJSONString(new User("liu",1)),XContentType.JSON);
    request.source(JSON.toJSONString(new User("min",2)),XContentType.JSON);
    request.source(JSON.toJSONString(new User("kai",3)),XContentType.JSON);
    IndexResponse index = restHighLevelClient.index(request, RequestOptions.DEFAULT);
    System.out.println(index.status());// created
}

7.批量添加数据

/**
     * 批量进行增删改查
     * @throws IOException
     */
    @Test
    public void testBatchDelAndUpdateAndIndex() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();//创建批量处理的请求对象
        for (int i = 2; i < 30; i++) {
            /**
             * 批量更新
             * @Param:索引、id、更新的字段数据(指定数据的格式:XContentType.JSON)
             * 注意:更新需要 .doc
             *      UpdateRequest updateRequest = new UpdateRequest("hong_index","200"+i)
             *               .doc(XContentType.JSON,"user","u雷神"+i,"message","m格鲁特"+i,"postDate",new Date());
             *      bulkRequest.add(updateRequest);
             */

            /**
             * 批量删除:只需要传索引和要删除的id
             * @Param:索引名和id
             *      bulkRequest.add(new DeleteRequest("hong_index","200"+i));
             */
            bulkRequest.add(new DeleteRequest("hong_index","200"+i));


            /**
             * 批量添加:
             * @Param:索引、id、以及要添加的数据(指定数据的格式:XContentType.JSON)
             * 注意:更新需要 .source
             * bulkRequest.add(new IndexRequest ( " hong_index ")
             *         .id("200"+i)
             *         .source(XContentType.JSON,"user","u钢铁侠"+i,"message","m美国队长"+i,"postDate",new Date()));
             */

        }
        BulkResponse bulkItemResponses = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println("批量添加后响应结果:"+bulkItemResponses.status());
        System.out.println("bulkItemResponses:"+bulkItemResponses);
        System.out.println("==============================分割================================");
        client.close();
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个开箱即用的框架,可以简化Java应用程序的开发。而Elasticsearch是一个开源的搜索引擎,具有强大的全文搜索和分析能力。 要在Spring Boot操作Elasticsearch,首先需要在项目的依赖管理中增加Elasticsearch的相关依赖,例如elasticsearchspring-boot-starter-data-elasticsearch。 在配置文件(application.properties或application.yml)中,需要设置Elasticsearch的连接信息,如主机名、端口号和索引名称等。可以通过spring.data.elasticsearch.cluster-nodes和spring.data.elasticsearch.cluster-name属性来进行配置。 接下来,在Java代码中,可以使用Spring Data Elasticsearch提供的API来进行操作。可以通过注解方式定义实体类和索引,使用ElasticsearchRepository来实现数据的增删改查操作。 通过ElasticsearchRepository的save方法可以将数据保存到Elasticsearch中。通过findById方法可以根据ID查询数据,通过search方法可以进行全文搜索等。 在使用Elasticsearch的时候,还可以进行索引的创建和删除操作。可以使用IndicesAdminClient提供的API来调用创建和删除索引的操作。 此外,Elasticsearch还提供了丰富的搜索功能,如分页查询、排序查询、聚合查询等。可以通过QueryBuilder和SearchRequestBuilder等类来构建复杂的查询语句。 总之,Spring BootElasticsearch的结合可以提供一个简便而强大的搜索引擎应用程序开发框架。开发人员可以通过简单的配置和API调用来实现数据的存储、检索和分析功能,大大简化了开发过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值