本文介绍使用PHP、Python和Java客户端访问阿里云Elasticsearch(简称ES)的方法,并提供了示例代码和注意事项供您参考。

PHP语言

警告
  • ES的PHP客户端提供的默认连接池并不适合云上环境。阿里云ES提供了负载均衡的域名服务,因此PHP客户端访问程序必须使用SimpleConnectionPool作为连接池,否则在触发阿里云ES重启操作时会出现访问连接异常的问题。
  • PHP客户端访问程序必须具备访问连接失败重连的机制。因为在PHP客户端访问程序已使用SimpleConnectionPool作为连接池后,不排除在触发阿里云ES重启操作时还会出现访问连接异常问题(例如提示No enabled connection),因此PHP客户端需要具备访问连接失败重连的机制。
通过PHP客户端访问阿里云ES的9200端口进行测试,示例代码如下,详情请参见elasticsearch-php
<?php
require 'vendor/autoload.php';
use Elasticsearch\ClientBuilder;

$client = ClientBuilder::create()->setHosts([
  [
    'host'   => '<HOST>',
    'port'   => '9200',
    'scheme' => 'http',
    'user'   => '<USER NAME>',
    'pass'   => '<PASSWORD>'
  ]
])->setConnectionPool('\Elasticsearch\ConnectionPool\SimpleConnectionPool', [])
  ->setRetries(10)->build();

$indexParams = [
  'index'  => 'my_index',
  'type'   => 'my_type',
  'id'     => '1',
  'body'   => ['testField' => 'abc'],
  'client' => [
    'timeout'         => 10,
    'connect_timeout' => 10
  ]
];
$indexResponse = $client->index($indexParams);
print_r($indexResponse);

$searchParams = [
  'index'  => 'my_index',
  'type'   => 'my_type',
  'body'   => [
    'query' => [
      'match' => [
        'testField' => 'abc'
      ]
    ]
  ],
  'client' => [
    'timeout'         => 10,
    'connect_timeout' => 10
  ]
];
$searchResponse = $client->search($searchParams);
print_r($searchResponse);
?>
表 1. 变量值说明
变量值 说明
<USER NAME> 替换为访问阿里云ES实例的用户名。
<PASSWORD> 替换为访问阿里云ES实例的密码。
<HOST> 替换为阿里云ES实例基本信息页面中的内网或外网地址。

Python语言

通过Python客户端访问阿里云ES的9200端口进行测试,示例代码如下,详情请参见elasticsearch-py

from elasticsearch import Elasticsearch, RequestsHttpConnection
import certifi
es = Elasticsearch(
    ['<HOST>'],
    http_auth=('username', 'password'),
    port=9200,
    use_ssl=False
)
res = es.index(index="my_index", doc_type="my_type", id=1, body={"title": "One", "tags": ["ruby"]})
print(res['created'])
res = es.get(index="my_index", doc_type="my_type", id=1)
print(res['_source'])

Java语言

注意
  • ES官方已经不再维护TransportClient,不建议通过TransportClient来访问ES,使用TransportClient 5.5.3版本在建立连接时会提示NoNodeAvailableException的问题。建议使用Java Low Level REST Client来访问ES。
  • 本文提供的Java REST Client示例主要适用于阿里云ES 5.5.3版本,不适用于阿里云ES 6.3.2版本。如果您的ES实例是6.3.2版本,可参考ES Java REST Client 6.3.2官方文档。
  • Java REST Client版本需要与ES实例版本保持一致。

通过Java REST Client访问阿里云ES前,您需要完成以下准备工作:

通过Java REST Client访问阿里云ES的9200端口进行测试,示例代码如下。
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.entity.ContentType;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import java.io.IOException;
import java.util.Collections;
public class RestClientTest {
    public  static void main(String[]args){
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials("<USER NAME>", "<PASSWORD>"));
        RestClient restClient = RestClient.builder(new HttpHost("<HOST>", 9200))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                        return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                }).build();
        try {
            //index a document
            HttpEntity entity = new NStringEntity("{\n\"user\" : \"kimchy\"\n}", ContentType.APPLICATION_JSON);
            Response indexResponse = restClient.performRequest(
                    "PUT",
                    "/index/type/123",
                    Collections.<String, String>emptyMap(),
                    entity);
            //search a document
            Response response = restClient.performRequest("GET", "/index/type/123",
                    Collections.singletonMap("pretty", "true"));
            System.out.println(EntityUtils.toString(response.getEntity()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
表 2. 变量值说明
变量值 说明
<USER NAME> 替换为访问阿里云ES实例的用户名。
<PASSWORD> 替换为访问阿里云ES实例的密码。
<HOST> 替换为阿里云ES实例基本信息页面中的内网或外网地址。

Go语言

通过Go语言访问阿里云ES的9200端口进行测试,示例代码如下。

使用Go语言连接阿里云ES前,您需要完成以下准备工作:
package main

import (
    "context"
    "gopkg.in/olivere/elastic.v5"
    "gopkg.in/olivere/elastic.v5/config"
    "log"
)

const (
    url      = "http://es-cn-xxxxxx.public.elasticsearch.aliyuncs.com:9200"     //<1>
    username = "elastic"        //<2>
    password = "password"       //<3>
)

func main() {
    var sniff = false    //<4>  
    cfg := &config.Config{
        URL:      url,
        Username: username,
        Password: password,
    }

    cfg.Sniff = &sniff          
    var client, err = elastic.NewClientFromConfig(cfg)
    if err != nil {
        log.Println(err)
        return
    }

    exists, err := client.IndexExists("index_test").Do(context.Background())   //<5>
    if err != nil {
        log.Println(err)
    }
    log.Println(exists)
}
表 3. 变量值说明
参数 说明
<1> :url 替换为阿里云ES的访问域名,可在实例的基本信息页面获取。
<2>:username 阿里云ES的访问账号,默认为elastic
<3>:password 阿里云ES的访问密码,可在创建实例时设置。
<4>:sniff 必须设置为false,防止二次探测,导致连接失败。
<5>:exists, err 在阿里云ES上新建一个索引index_test(需要替换为您的索引名称),并根据连接状态返回日志信息。

连接成功后,返回如下结果。

2019/11/29 10:07:37 true

更多语言示例请参见HTTP/REST Clients and Security