专栏首页腾讯云Elasticsearch ServiceElasticsearch Rest Client实战
原创

Elasticsearch Rest Client实战

Elasticsearch Rest Client实战

Elasticsearch官方推荐使用Java REST客户端连接集群并进行数据操作。Java REST client有两种:一种是Java Low Level REST Client, 使用该客户端需要将http请求的body手动拼成json格式,http响应也必须将返回的json数据手动封装成对象;另外一种是Java High Level REST Client, 该客户端基于低级客户端实现,提供API解决低级客户端需要手动转换数据格式的问题。

Java High Level REST Client

使用Java High Level REST Client访问集群,示例步骤与代码如下:

1 添加maven依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>5.6.11</version>
</dependency>

2 实战代码

import org.apache.http.HttpHost;
import org.apache.log4j.Logger;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.rest.RestStatus;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: bellengao, bellengao@tencent.com
 * Date: 2018-08-27
 * Time: 下午6:00
 */
public class TestHighLevelRestClient {
    private static Logger logger = Logger.getLogger(TestHighLevelRestClient.class);

    public  static void main(String[]args){
        // 初始化RestClient, hostName和port填写集群的内网vip地址与端口
        RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));
        // 设置超时时间
        builder.setMaxRetryTimeoutMillis(10000);
        RestClient restClient = builder.build();
        // 由Low Level Client构造High Level Client
        RestHighLevelClient client = new RestHighLevelClient(restClient);

        // 索引文档
        Map<String, Object> jsonMap = new HashMap<String, Object>();
        jsonMap.put("user", "bellen");
        jsonMap.put("name", new Date());
        jsonMap.put("message", "trying out Elasticsearch");
        IndexRequest indexRequest = new IndexRequest("posts", "doc", "1")
                .source(jsonMap);

        try {
            // 获取响应结果
            IndexResponse indexResponse = client.index(indexRequest);
            String index = indexResponse.getIndex();
            String type = indexResponse.getType();
            String id = indexResponse.getId();
            long version = indexResponse.getVersion();

            if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) {
                logger.info("doc indexed, index: "+ index +", type:"+ type +",id:"+ id+",version:"+version);
            } else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
                logger.info("doc updated, index: "+ index +", type:"+ type +",id:"+ id+",version:"+version);
            }
        }catch(ElasticsearchException e) {
            if (e.status() == RestStatus.CONFLICT) {
                logger.error("version conflict");

            }
        }catch(Exception e){
            logger.error("execute index api failed, "+ e.toString());
        }


        // 查询文档
        GetRequest getRequest = new GetRequest(
                "posts",
                "doc",
                "1");
        try {
            // 获取响应结果
            GetResponse getResponse = client.get(getRequest);
            String index = getResponse.getIndex();
            String type = getResponse.getType();
            String id = getResponse.getId();
            if (getResponse.isExists()) {
                long version = getResponse.getVersion();
                String sourceAsString = getResponse.getSourceAsString();
                logger.info("get doc, index: "+ index +", type:"+ type +",id:"+ id+",version:"+version +", source:"+ sourceAsString);
            }
        }catch (ElasticsearchException e) {
            if (e.status() == RestStatus.NOT_FOUND) {
                logger.warn("doc not found");
            }
        }
        catch(Exception e){
            logger.error("execute get api failed, "+ e.toString());
        }

        // 关闭客户端
        try {
            restClient.close();
        }catch (Exception e){
            logger.error("close rest client exception:"+ e.toString());
        }
    }
}

注意事项

  1. client版本需要与ES集群版本保持一致,否则可能会出现兼容性问题
  2. Java High Level Client构建于Java Low Level Client之上,两种client都是基于http协议连接ES集群,Java High Level Client可提供的API种类随着版本升级会越来越多,如果当前版本的Java High Level Client提供的API不满足需求,可以通过升级ES集群版本和Client版本解决。
  3. 使用TCP协议连接ES集群的Transport Client官方已经不再维护,建议使用使用HTTP协议连接集群的Java High Level Client或者Java Low Level Client。可以参考官方文档由TransportClient迁移至Java High Level Client:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/5.6/java-rest-high-level-migration.html

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 总结最近半年对Elasticsearch开源项目的贡献

    自从2019年对Elasticsearch项目提交过一次代码之后,开始逐渐关注社区里的新动态,并且尝试去解决一些看起来容易上手的issue,通过这个过程去理解源...

    bellen
  • Elasticsearch:执行同样的查询语句多次结果不一致?!

    最近有用户让帮忙看一下一个诡异的问题,同样的一个查询语句,执行多次查询结果竟然不一致,查询结果中hits.total一会是30,一会为15,这是为什么呢?

    bellen
  • logstash在Elasticsearch中创建的默认索引模板问题

    在ELK架构中,使用logstash收集服务器中的日志并写入到Elasticsearch中,有时候需要对日志中的字段mapping进行特殊的设置,此时可以通过自...

    bellen
  • 尾递归优化原理与Python实现(以Fibonacci数列和小明爬楼梯问题为例)

    众所周知,在函数递归调用时,要保存函数调用的位置以便使得被调函数结束后能够返回正确的位置,这个信息保存在线程栈中。由于栈的空间有限,所以如果函数递归调用深度超过...

    Python小屋屋主
  • JavaWeb(四)JDBC操作Oracle

    JDBC:Java DataBase Connectivity(java数据库连接) SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范...

    二十三年蝉
  • JDBC

    import static org.junit.Assert.*; import java.sql.Connection; import java.sql.D...

    用户1624346
  • 第一次和SQLite接触

    要使用java程序连接SQLite,并与SQLite进行数据存取操作,必须在系统上设置SQLite JDBC驱动程序和安装Java JDK。按照以下步骤进行:

    IT小马哥
  • Django 惰性机制

    惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是...

    py3study
  • C++知识整理(进制)

    ++输出二进制、十进制、八进制和十六进制总结 分类: C++ 2013-01-14 02:26 592人阅读 评论(0) 收藏 举报 在C++中,默认状态下,数...

    Gxjun
  • 1036. 跟奥巴马一起编程(15)

    美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编...

    AI那点小事

扫码关注云+社区

领取腾讯云代金券