Elasticsearch¶
服务概述¶
Elasticsearch 是一款基于 Lucene 构建的开源分布式检索和分析引擎,通过 RESTful API 提供近实时的索引、搜索功能。
新浪云 Elasticsearch 是基于开源的 Elasticsearch 2.1 版本搭建的一个集群,运行在新浪云的内网环境。对外开放 https API, 通过 Basic Authentication 使用。在新浪云上,您不需要管理 Elasticsearch 集群,只需要创建自己的索引就可以通过 API 索引、搜索您的数据,免去您运维 Elasticsearch 集群的苦恼。
创建索引(Index)¶
在控制台管理页面导航中点击『数据库与缓存/Elasticsearch』进入创建页面。
点击“创建索引”,输入索引名并选择容量后点“确定”,一个索引就创建好了。注意:索引是用户级别的。
点击“查看帐号”查看您索引的帐号和密码,通过 Basic Authentication 的官方 API 使用。
创建索引默认分片以及副本配置如下:
- 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 管理工具。
错误说明¶
- 限制的功能会以如下形式的错误返回
{"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 。