Elasticsearch(三)——交互方法

1,012 阅读3分钟

要与Elasticsearch进行交互,一般有两种方法,使用客户端,或者直接使用RESTful API(HTTP)。

客户端

Elasticsearch提供了Java、Groovy、JavaScript、.NET、 PHP、 Perl、 Python 和 Ruby等官方客户端

Java 客户端

介绍

Node client 和 Transport client

早期Elasticsearch提供的客户端,Node client(节点客户端)和Transport client(传输客户端)。 其通过9300端口并使用原生的Elasticsearch传输协议和Elasticsearch集群进行交互。

从理论上讲使用传输协议,无需执行REST所需的解析步骤,性能应该比HTTP更高。但是经过使用发现性能并没有高过少,甚至可以忽略不计。

通过使用原生Elasticsearch传输协议还带来了一些问题:

  • 当客户端与不同版本号的Elasticsearch实例通信时,会存在兼容性问题
  • JVM版本问题
  • 项目依赖问题
  • 安全问题

详情查看官方博客

Elasticsearch 7.0中已经弃用TransportClient,并将在8.0中完全移除。

Low Level REST Client

基于上面提到的问题,Elasticsearch于2016年发布了Low Level REST Client(低级客户端)。 它允许通过http请求与Elasticsearch集群进行通信。

功能

  • 与任何Elasticsearch版本兼容
  • 负载均衡
  • 故障转移
  • 持久连接
  • 节点发现

它之所以被称为低级客户端,是因为它没有帮助用户处理请求和响应,需要用户自己处理。

High Level REST Client

之后又在Low Level REST Client的基础上发布了High Level REST Client。 依赖于Elasticsearch Core,将Request对象作为参数,返回一个Response对象。所有API都可以同步或异步调用。

High Level REST Client向上兼容,能确保与大于等于6.7.0版本的Elasticsearch集群通信。

使用

添加pom依赖
<!--Java High Level REST Client-->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>6.7.0</version>
</dependency>
示例
  1. 创建
RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http"),
                        new HttpHost("localhost", 9201, "http")));
  1. 搜索
//自定义请求配置
RequestOptions options = RequestOptions.DEFAULT.toBuilder().build();
//搜索请求
SearchRequest searchRequest = new SearchRequest("indexName");
        searchRequest.types("typeName");
        SearchSourceBuilder ssb = new SearchSourceBuilder();
        //筛选
        BoolQueryBuilder queryBuilders = QueryBuilders.boolQuery();
        TermsQueryBuilder tqb = QueryBuilders.termsQuery("name", "zhangsan");
        queryBuilders.filter(tqb);
        RangeQueryBuilder rqb = QueryBuilders.rangeQuery("time.keyword").from("2019-12-24").to("2019-12-25");
        queryBuilders.filter(rqb);
        ssb.query(queryBuilders);
        //排序
        ssb.sort("time.keyword", SortOrder.DESC);
        //分页
        ssb.from(0);
        ssb.size(20);
        searchRequest.source(ssb);
        try {
            SearchResponse searchResponse = client.search(searchRequest, options);
            System.out.println(searchResponse.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
  1. 关闭
client.close();

RESTful API

curl命令

可以直接使用 curl 命令来和 Elasticsearch 交互

请求格式

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

# curl -X<HTTP方法> '<协议>://<主机名>:<端口>/<API路径>?<请求参数>' -d '<请求主体>'
  • VERB: HTTP方法,包括GET、POST、PUT、HEAD、DELETE。
    • GET 查看
    • POST 创建
    • PUT 修改
    • HEAD 查看是否存在
    • DELETE 删除
  • PROTOCOL: 协议 http 或者 http
  • HOST: 集群中的任何一个节点的主机名
  • PORT: 端口 默认9200
  • QUERY_STRING: 任意可查询的字符串,可选
  • BODY: JSON 格式的请求体,可选

示例

查看集群健康状态

curl -XGET '172.x.x.1:9200/_cluster/health?pretty'

响应结果

{
  "cluster_name" : "my-application",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 9,
  "active_shards" : 9,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 1,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 90.0
}

上一篇: Elasticsearch(二)——安装

下一篇: Elasticsearch——API大全