跳到主要内容

18、ElasticSearch 实战:ElasticSearch JavaApi 文档增删改查操作

JavaApi 文档增删改查操作

索引创建成功之后就可以进行文档的操作了,下面一次对文档进行增删改查了。

新增文档

新增文档操作的步骤如下:

1、 定义要链接主机的信息,这里使用org.apache.http.HttpHost对象;
2、 构建RestClientBuilder,该对象由RestClient.builder(host);构建;
3、 建立与ES服务器链接的客户端对象RestHighLevelClient,直接创建即可;
4、 构建创建文档的请求对象,需要注意的是虽然是创建文档,但是依然用的是IndexRequest对象``org.elasticsearch.action.index.IndexRequest
5、 填充相应的请求数据;

  • 设置将文档加到哪个index下,indexRequest.index("teacher");.
  • 如果要自定义稳定id,需要设置IndexRequest的id属性,indexRequest.id("7001");
  • 后续我们将要添加的文档弄成JSON格式。然后加入到indexRequest中,调用方法source(),这时候也需要设置文档提交使用的格式:.source(json, XContentType.JSON);.

6、 提交请求,添加文档client.index(indexRequest,RequestOptions.DEFAULT);
7、 最后要关闭client要不然进程会一致挂起;

介绍完流程之后,看编写的代码如下:

package com.maomao.elastic.search.doc;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.maomao.elastic.search.entry.Teacher;
import org.apache.http.HttpHost;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;

/**
 * 文档创建
 */
public class DocCreate {
   
     

    public static void main(String[] args) throws Exception {
   
     
        HttpHost host = new HttpHost("127.0.0.1", 9200, "http");
        RestClientBuilder builder = RestClient.builder(host);
        RestHighLevelClient client = new RestHighLevelClient(builder);

        // 构建创建文档的请求对象
        IndexRequest indexRequest = new IndexRequest();
        indexRequest.index("teacher");
        indexRequest.id("7001");
        Teacher teacher = new Teacher();
        teacher.setAge(23);
        teacher.setName("高俅");
        teacher.setTitle("教授");
        teacher.setSex("男");
        ObjectMapper mapper = new ObjectMapper();
        indexRequest.source(mapper.writeValueAsString(teacher), XContentType.JSON);
        // 发送创建文档请求
        IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(response.getResult());
        client.close();
    }
    
}

执行之后返回response的类型为org.elasticsearch.action.index.IndexResponseresult值为CREATED。从结果上看是成功的,我们是用POSTMan。查看服务器,确认是否真实创建文档成功。
 
从查询的结果可以确认文档确实已经添加成功。

文档修改

操作ESjava api 从步骤上类似, 文档的修改操作差异也体现在文档请求对象的不同,以及请求对象不同上。所以主要的差异在456 三个步骤上。

1、 4步中创建的对象不一样,对象为org.elasticsearch.action.update.UpdateRequest
2、 5步中填充的数据不一样,但是我们都要设置indexid
3、 UpdateRequest,对象是对局部修改的操作请求对象,他提供了一个doc()方法填充修改内容,第一个参数为执行提交数据类型,例如:XContentType.JSON后面就是要修改内容的键值对,所以doc方法就是奇数个.1+2n的个数例如本例子我们将7001的性别从改为女``updateRequest.doc(XContentType.JSON,"sex","女");
带入如下:

package com.maomao.elastic.search.doc;

import org.apache.http.HttpHost;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;

/**
 * 局部文档更新
 */
public class DocPartUpdate {
   
     

    public static void main(String[] args) throws Exception {
   
     
        HttpHost host = new HttpHost("127.0.0.1", 9200, "http");
        RestClientBuilder builder = RestClient.builder(host);
        RestHighLevelClient client = new RestHighLevelClient(builder);

        // 构建修改文档的请求对象

        UpdateRequest updateRequest = new UpdateRequest();
        updateRequest.index("teacher").id("7001");
        updateRequest.doc(XContentType.JSON, "sex", "女");
        // 发送创建文档请求
        UpdateResponse response = client.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(response.getResult());
        client.close();
    }

}

运行代码得到结果UpdateResponse, 得到结果UPDATED
再使用Postman进行查询,验证是否有真正修改掉。
 
从上的结果可以看出修改已经成功。

文档查询

查询指定按照定位来讲,只要有了indexid就能精确定位出文档了。步骤上也类似,仅456 三个步骤上存在差异。

1、 4步构建的对象为,org.elasticsearch.action.get.GetRequest类的对象,;
2、 5步指定indexid即可getRequest.index("teacher").id("7001");
3、 发送查询文档请求,client.get(getRequest,RequestOptions.DEFAULT);得到响应对象GetResponseresponse.;
4、 得到的响应内容response的方法getSource()可以得到响应文档内容;
代码如下:

package com.maomao.elastic.search.doc;

import org.apache.http.HttpHost;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;

import java.io.IOException;

/**
 * 文档查询
 */
public class DocGet {
   
     

    public static void main(String[] args) throws IOException {
   
     
        HttpHost host = new HttpHost("127.0.0.1", 9200, "http");
        RestClientBuilder builder = RestClient.builder(host);
        RestHighLevelClient client = new RestHighLevelClient(builder);

        // 构建请求文档的请求对象
        GetRequest getRequest = new GetRequest();
        getRequest.index("teacher").id("7001");

        // 发送查询文档请求
        GetResponse response = client.get(getRequest, RequestOptions.DEFAULT);
        System.out.println(response.getSource());
        client.close();
    }

}

执行结果:
 

文档删除

文档删除和查询类似,都需得定位到文档内容先,即必须指定indexid。步骤差异仅456 三个步骤上。

1、 4步构建的对象是DeleteRequest
2、 5步只需要指定indexID``delete.index("teacher").id("7001");.;
3、 发送删除请求执行delete()方法.client.delete(delete,RequestOptions.DEFAULT);.;
代码:

package com.maomao.elastic.search.doc;

import org.apache.http.HttpHost;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;

import java.io.IOException;

/**
 * 文档删除
 */
public class DocDelete {
   
     

    public static void main(String[] args) throws IOException {
   
     
        HttpHost host = new HttpHost("127.0.0.1", 9200, "http");
        RestClientBuilder builder = RestClient.builder(host);
        RestHighLevelClient client = new RestHighLevelClient(builder);

        // 构建删除文档的请求对象
        DeleteRequest delete = new DeleteRequest();
        delete.index("teacher").id("7001");

        // 发送删除文档请求
        DeleteResponse response = client.delete(delete, RequestOptions.DEFAULT);
        System.out.println(response.getResult());
        client.close();
    }

}

执行结果得到响应结果DeleteResponse response,调用getResult()方法可以获取到执行结果的描述DELETED
通过PostMan查询文档结果。
 
从结果上看,已经不能找到响应的文档内容了。