全部产品
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件

Elasticsearch测试

更新时间:2018-01-18 18:20:30

访问阿里云Elasticsearch 先决条件

  • 阿里云Elasticsearch 与依赖的阿里云ECS 必须处于同一个 VPC 下
  • 阿里云ECS 处于经典网络下,期望访问专有网络(VPC)中的阿里云Elasticsearch,请先参考 经典网络访问常见问题 文档。

Elasticsearch测试

阿里云Elasticsearch 创建完成之后可以进行连接测试。可以通过 curl 调用命令测试,也可以下载 Elasticsearch client

注意

  • 默认username为 elastic
  • password 为您在购买阿里云ES界面中指定的密码,或初始化 Kibana 时指定的密码。

使用curl访问9200端口进行测试

  1. curl -u username:password 'http://<HOST>:9200/filebeat/my_type/'?pretty -d '{"title": "One", "tags": ["ruby"]}'

系统会返回:

  1. {
  2. "_index" : "filebeat",
  3. "_type" : "my_type",
  4. "_id" : "AV-bTkaTwdiHxfaSqlAt",
  5. "_version" : 1,
  6. "result" : "created",
  7. "_shards" : {
  8. "total" : 2,
  9. "successful" : 2,
  10. "failed" : 0
  11. },
  12. "created" : true
  13. }

注:若您创建的阿里云Elasticsearch实例版本没有 with_X-Pack 信息,则访问该ES实例时,可以不指定用户名和密码信息,可参考下面格式。

  1. curl http://<HOST>:9200/index_name/type_name -XPOST -d '{"title": "One", "tags": ["ruby"]}'

使用Python访问9200端口进行测试

  1. from elasticsearch import Elasticsearch, RequestsHttpConnection
  2. import certifi
  3. es = Elasticsearch(
  4. ['<HOST>'],
  5. http_auth=('username', 'password'),
  6. port=9200,
  7. use_ssl=False
  8. )
  9. res = es.index(index="my_index", doc_type="my_type", id=1, body={"title": "One", "tags": ["ruby"]})
  10. print(res['created'])
  11. res = es.get(index="my-index", doc_type="my-type", id=1)
  12. print(res['_source'])

使用Java访问9300端口进程测试

使用须知(常见问题)

  • cluster.name 参数值,必须为阿里云ES 对应实例ID,否则会报 NoNodeAvailableException[None of the configured nodes are available
  • client.transport.sniff 参数值,必须为false,如果值为true 也会报 NoNodeAvailableException
  • 必须要使用 PreBuiltXPackTransportClient 这个带有X的类名,而不是PreBuiltPackTransportClient 这个不带X的类名,否者会导致访问异常。
  • InetAddress.getByName() 方法中参数值必须替换为下面域名地址(注意:添加 http:// 后会报错
    替换为阿里云es实例ID.elasticsearch.aliyuncs.com
  • 用 TransportClient 访问时,注意要用 x-pack-transport-5.3.3 版,并且elasticsearch版本也必须为 5.3.3版,否者访问会有问题,请先参考代码下方注意事项。(ES项目maven的pom核心配置参考)
  1. TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
  2. .put("cluster.name", "<YOUR CLUSTER NAME>")
  3. .put("xpack.security.user", "<USER NAME>:<PASSWORD>")
  4. .put("client.transport.sniff", false)
  5. .build())
  6. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("<HOST>"), 9300));
  7. IndexResponse idxResp = client.prepareIndex().setIndex("my-index").setType("my-type").setId("1").setOpType(
  8. IndexRequest.OpType.INDEX).setSource("{\"title\",\"One\", \"tags\" : [\"ruby\"]}").setSource("id",1).execute().get();
  9. System.out.println(idxResp.toString());
  10. GetResponse getResp = client.prepareGet().setIndex("my-index").setType("my-type").setId("1").execute().get();
  11. System.out.println(getResp.getSourceAsString());
  12. client.close();

注:Elastic官方已不建议使用 TransportClient,使用5.5.3版,建立连接时会偶尔遇到 NoNodeAvailableException 的问题,可用以下方法绕过:

  • ES官方建议通过 rest client 进行访问,rest client 版本尽量一致,否则会有问题。
  • 使用 x-pack-transport-5.3.3 版进行访问,并且elasticsearch 版本也必须为 5.3.3版,否者访问会有问题。

注:由于阿里云Elasticsearch是5.5.3版本,所以需要您的JDK至少在1.8版本及以上版本

注:更多语言demo请参考:https://www.elastic.co/guide/en/x-pack/current/http-clients.html

简单的索引操作

创建文档

可以使用 POST的方式在Elasticsearch中创建:

  1. curl http://<id>.elasticsearch.aliyuncs.com:9200/my_index/my_type -XPOST -d '{"title": "One", "tags": ["ruby"]}'

其中my_index是索引名称。每一个文档都会拥有自己的IDtype,在返回的结果中会显示响应的IDtype,如果在创建时没有指定,则系统将会为其随机生成一个。

注释:如果指定的index名称不存在,则在创建document时系统将自动创建index。

创建成功,系统会返回:

  1. {"_index":"my_index","_type":"my_type","_id":"AV4JIvi15ny3i8DCdK1H","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"created":true}

更新文档

如果在Elasticsearch中存在文档,可以使用http://<id>.elasticsearch.aliyuncs.com:9200/my_index/my_type/<doc_id>语句更新文档,其中<doc_id>是文档的标识ID:

  1. $ curl http://<id>.elasticsearch.aliyuncs.com:9200/my_index/my_type/AV4JIvi15ny3i8DCdK1H -XPOST -d '{"title": "Four updated", "tags": ["ruby", "php"]}'

创建成功,系统会返回:

  1. {"_index":"my_index","_type":"my_type","_id":"AV4JIvi15ny3i8DCdK1H","_version":2,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"created":false}

同样也可以使用批量的API进行更新。

检索文档

可以通过HTTP GET对文档进行检索查询:

  1. $ curl http://<id>.elasticsearch.aliyuncs.com:9200/my_index/my_type/AV4JIvi15ny3i8DCdK1H
  2. {
  3. "_index" : "my_index",
  4. "_type" : "my_type",
  5. "_id" : "_b-kbI1MREmi9SeixFNEVw",
  6. "_version" : 2,
  7. "exists" : true, "_source" : {
  8. "title": "Four updated", "tags": ["ruby", "php"]
  9. }

搜索文档

可以通过HTTP GETorHTTP POST网络请求的方式对文档进行搜索,通过URI参数来制定搜索对象,搜索的目标可以是:

  1. http://<id>.elasticsearch.aliyuncs.com:9200/_search
  2. http://<id>.elasticsearch.aliyuncs.com:9200/{index_name}/_search
  3. http://<id>.elasticsearch.aliyuncs.com:9200/{index_name}/{type_name}/_search

举一个例子:

  1. $ curl http://<id>.elasticsearch.aliyuncs.com:9200/my_index/my_type/_search?q=title:T*

复杂搜索

必须使用HTTP POST网络请求的方式对文档进行复杂搜索,举一个例子:

  1. $ curl http://<id>.elasticsearch.aliyuncs.com:9200/my_index/my_type/_search?pretty=true -XPOST -d '{
  2. "query": {
  3. "query_string": {"query": "*"}
  4. },
  5. "facets": {
  6. "tags": {
  7. "terms": {"field": "tags"}
  8. }
  9. }}'

注释:使用?pretty=true是为了让结果返回结果更具备可读性。

删除文档

  1. $ curl http://<id>.elasticsearch.aliyuncs.com:9200/{index}/{type}/{id} -XDELETE

删除指定类型对文档

  1. $ curl http://<id>.elasticsearch.aliyuncs.com:9200/{index}/{type} -XDELETE

删除一个索引

  1. $ curl http://<id>.elasticsearch.aliyuncs.com:9200/{index} -XDELETE

补充:更多文档可以参考Elastic.co官方帮助中心:https://cloud.elastic.co/#help/

本文导读目录