Table of Contents

上一个主题

定时任务

下一个主题

Java 分布式 Session

本页

Elasticsearch

服务概述

Elasticsearch 是一款基于 Lucene 构建的开源分布式检索和分析引擎,通过 RESTful API 提供近实时的索引、搜索功能。

新浪云 Elasticsearch 是基于开源的 Elasticsearch 2.1 版本搭建的一个集群,运行在新浪云的内网环境。对外开放 https API, 通过 Basic Authentication 使用。在新浪云上,您不需要管理 Elasticsearch 集群,只需要创建自己的索引就可以通过 API 索引、搜索您的数据,免去您运维 Elasticsearch 集群的苦恼。

创建索引(Index)

在控制台管理页面导航中点击『数据库与缓存/Elasticsearch』进入创建页面。

点击“创建索引”,输入索引名并选择容量后点“确定”,一个索引就创建好了。注意:索引是用户级别的。

点击“查看帐号”查看您索引的帐号和密码,通过 Basic Authentication 的官方 API 使用。

../../_images/es-create.png

创建索引默认分片以及副本配置如下:

  • number_of_shards:5
  • number_of_replicas:1

使用索引(Index)

您通过新浪云控制台创建了索引,就可以通过带 Basic Authentication 的 API 索引、搜索了。地址是: https://es.sinacloud.com 。Basic Authentication 的帐号和密码在 Elasticsearch 创建页点“查看帐号”查询。

例如:您在控制台创建了名为 aktestes1234_hellosae 的索引,您的帐号是 testes1234,密码是 i4mjh1hw4ds1103dk5m2d55l4ff44t424flkf4dc。就可以像下面一样通过 Elasticsearch 原生 API 索引、查询您的数据了。

$ curl 'https://es.sinacloud.com/aktestes1234_hellosae/people/_susan' -u 'testes1234:i4mjh1hw4ds1103dk5m2d55l4ff44t424flkf4dc' -d  '{"first_name": "susan","last_name": "lee","age": 19}'
{"_index":"aktestes1234_hellosae","_type":"people","_id":"_susan","_version":2,"_shards":{"total":2,"successful":2,"failed":0},"created":false}

$ curl 'https://es.sinacloud.com/aktestes1234_hellosae/people/_susan' -u 'testes1234:i4mjh1hw4ds1103dk5m2d55l4ff44t424flkf4dc'
{"_index":"aktestes1234_hellosae","_type":"people","_id":"_susan","_version":2,"found":true,"_source":{"first_name": "susan","last_name": "lee","age": 19}}

Elasticsearch API

因不需要您运维 Elasticsearch 集群,我们对原生 API 进行了部分权限的回收。

开放的 API 和 Elasticsearch 的原生 API 是一致的。 下面是开放的常用原生 API:

  • Index API
  • Get API
  • Delete API
  • Update API
  • Multi Get API
  • Get Index
  • Indices Exists
  • Get mapping
  • Types Exists
  • Get Settings
  • Indices Stats
  • cat APIs
  • cat count
  • Search
  • URI Search
  • Request Body Search
  • Count API
  • Search Exists API
  • Explain API
  • Query and filter context
  • Match All Query
  • Full text queries

插件

当前我们的 Elasticsearch 集群内置了以下常用的插件,暂不支持用户自己安装。

  • analysis-icu :使用 ICU 实现的一个针对亚洲语言的分词器插件。

    $ curl -XGET 'https://es.sinacloud.com/aktestes1234_hellosae/_analyze?pretty' -d '{"tokenizer": "icu_tokenizer","text": "虫洞是宇宙中可能存在的连接两个不同时空的狭窄隧道"}' -u 'testes1234:i4mjh1hw4ds1103dk5m2d55l4ff44t424flkf4dc'
    
  • analysis-smartcn :针对中文或中英文混合的文本分词器插件。

    $ curl -XGET 'https://es.sinacloud.com/aktestes1234_hellosae/_analyze?pretty' -d '{"analyzer": "smartcn","text": "虫洞是宇宙中可能存在的连接两个不同时空的狭窄隧道"}' -u 'testes1234:i4mjh1hw4ds1103dk5m2d55l4ff44t424flkf4dc'
    
    # 也可以通过下述命令指定type某个字段的分词器
    $ curl -XPUT 'https://es.sinacloud.com/aktestes1234_hellosae/_mapping/people' -u'testes1234:i4mjh1hw4ds1103dk5m2d55l4ff44t424flkf4dc' -d'{"properties":{"msg":{"type":"string", "analyzer": "smartcn"}}}'
    
  • elasticsearch-head :一个开源的 Web 管理工具。

    访问地址: https://es.sinacloud.com/_plugin/head/

错误说明

  • 限制的功能会以如下形式的错误返回
{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"No feature for name [_search template]"}],"type":"illegal_argument_exception","reason":"No feature for name [_search template]"},"status":400}
  • 容量超配会以如下形式的错误返回
{"error":{"root_cause":[{"type":"index_over_quota_exception","reason":"Over quota for index [your index]"}],"type":"index_over_quota_exception","reason":"Over quota for index [your index]"},"status":400}

Java

Java 应用可以使用基于 Restful 的客户端进行访问,但是要保证客户端支持 Basic Authentication 和 Https 功能,推荐使用 Jest 客户端,线上使用的 Elasticsearch 版本是 2.1,所以 Jest 版本使用 2.0 以上即可。

如果使用 maven 构建项目需要在 pom.xml 中引入如下配置:

<dependency>
    <groupId>io.searchbox</groupId>
    <artifactId>jest</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>io.searchbox</groupId>
    <artifactId>jest-common</artifactId>
    <version>2.0.0</version>
</dependency>

接下来我们就可以操作自己的 Elasticsearch。

首先,我们要初始化 JestClient ,初始化方式如下:

SSLContext sslContext = null;
try {
    sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
        public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
            return true;
        }
    }).build();
} catch (KeyManagementException e) {
    e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
} catch (KeyStoreException e) {
    e.printStackTrace();
}

HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;

SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
SchemeIOSessionStrategy httpsIOSessionStrategy = new SSLIOSessionStrategy(sslContext, hostnameVerifier);

JestClientFactory factory = new JestClientFactory();
factory.setHttpClientConfig(new HttpClientConfig.Builder("https://es.sinacloud.com/")
                .defaultSchemeForDiscoveredNodes("https") // required, otherwise uses http
                .sslSocketFactory(sslSocketFactory) // this only affects sync calls
                .httpsIOSessionStrategy(httpsIOSessionStrategy)
                .defaultCredentials("your_Elasticsearch_account", "your_Elasticsearch_password")// this only affects async calls
                .build()
);

JestClient client = factory.getObject();

初始化好之后,就可以通过 JestClient 进行操作了。

// 插入操作
Map<String,String> source = new LinkedHashMap<String,String>();
source.put("key", "value");
Index index = new Index.Builder(source).index("索引名").type("类型名").id("id").build();
try {
    JestResult result = client.execute(get);
    System.out.println(result.getJsonString());
} catch (IOException e) {
    e.printStackTrace();
}

// Get 操作
Get get = new Get.Builder("索引名", "").type(null).build();

try {
    JestResult result = client.execute(get);
    System.out.println(result.getJsonString());
} catch (IOException e) {
    e.printStackTrace();
}

更多关于 Jest 的操作参考这里 Jest