“Java Elasticsearch:基础”的版本间差异
		
		
		
		
		
		跳到导航
		跳到搜索
		
				
		
		
	
小 (Eijux移动页面Java Elasticsearch:入门至Java Elasticsearch:基础,不留重定向)  | 
				小无编辑摘要  | 
				||
| (未显示同一用户的1个中间版本) | |||
| 第1行: | 第1行: | ||
[[category:ElasticSearch  | [[category:Java&ElasticSearch]]  | ||
== 关于 ==  | == 关于 ==  | ||
相关内容基于 ES 官方的 '''Java REST Client'''(老的Java API 在 ES 7.0.0 以后废弃,不推荐使用)。  | |||
* 支持 Elasticsearch 5.6.x 以上。  | |||
* Java 1.8 以上。  | |||
Maven配置:  | |||
<syntaxhighlight lang="xml" highlight="">  | |||
<dependency>  | |||
    <groupId>org.elasticsearch.client</groupId>  | |||
    <artifactId>elasticsearch-rest-high-level-client</artifactId>  | |||
    <version>7.8.1</version>  | |||
</dependency>  | |||
</syntaxhighlight>  | |||
* 可以根据自己的 ES 版本选择对应的 Java REST Client 版本。  | |||
== 连接配置 ==  | |||
Java Elasticsearch '''RestHighLevelClient''' 的配置详情。  | |||
* '''请求都是通过 RestHighLevelClient 实例发出去的''';  | |||
RestHighLevelClient常用配置如下:  | |||
* elasticsearch连接地址  | |||
* elasticsearch账号/密码  | |||
* Http请求头  | |||
* 连接超时  | |||
* 设置线程池大小  | |||
=== 创建client ===  | |||
RestHighLevelClient 依赖 REST low-level client builder 进行配置,即依赖底层的 RestClientBuilder 对象进行参数设置:  | |||
<syntaxhighlight lang="Java" highlight="">  | |||
// 首先创建RestClientBuilder,后续章节通过RestClientBuilder对象进行参数配置。  | |||
RestClientBuilder restClientBuilder = RestClient.builder(  | |||
                new HttpHost("localhost", 9200, "http"), // 设置ES服务地址,支持多个  | |||
                new HttpHost("localhost", 9201, "http"));  | |||
// 创建 RestHighLevelClient,请求都是通过 RestHighLevelClient 实例发出去的。  | |||
RestHighLevelClient client = new RestHighLevelClient(restClientBuilder);  | |||
</syntaxhighlight>  | |||
=== 配置ES账号密码 ===  | |||
<syntaxhighlight lang="Java" highlight="">  | |||
restClientBuilder.setHttpClientConfigCallback(  | |||
    new RestClientBuilder.HttpClientConfigCallback() {  | |||
        @Override  | |||
        public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {  | |||
            // 通过CredentialsProvider实例,配置账号和密码  | |||
            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();  | |||
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("user", "password"));  | |||
            // 设置安全验证凭证  | |||
            return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);  | |||
        }  | |||
    });  | |||
</syntaxhighlight>  | |||
=== 设置Http Header ===  | |||
<syntaxhighlight lang="Java" highlight="">  | |||
// 创建header数组,可以设置多个header  | |||
Header[] defaultHeaders = new Header[]{new BasicHeader("header", "value")};  | |||
// 设置http header  | |||
restClientBuilder.setDefaultHeaders(defaultHeaders);   | |||
</syntaxhighlight>  | |||
=== Timeout设置 ===  | |||
<syntaxhighlight lang="Java" highlight="">  | <syntaxhighlight lang="Java" highlight="">  | ||
restClientBuilder.setRequestConfigCallback(  | |||
    new RestClientBuilder.RequestConfigCallback() {  | |||
        @Override  | |||
        public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {  | |||
            return requestConfigBuilder  | |||
                .setConnectTimeout(5000) // 设置连接超时时间,5秒  | |||
                .setSocketTimeout(60000); // 设置请求超时时间,1分种  | |||
        }  | |||
    });  | |||
</syntaxhighlight>  | |||
=== 设置线程池大小 ===  | |||
<syntaxhighlight lang="Java" highlight="">  | |||
restClientBuilder.setHttpClientConfigCallback(  | |||
    new RestClientBuilder.HttpClientConfigCallback() {  | |||
        @Override  | |||
        public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {  | |||
            return httpClientBuilder.setDefaultIOReactorConfig(  | |||
                                IOReactorConfig.custom()  | |||
                                    .setIoThreadCount(10) // 设置线程数  | |||
                                    .build());  | |||
        }  | |||
});  | |||
</syntaxhighlight>  | |||
== 快速入门 ==  | |||
=== 创建客户端 ===  | |||
在操作ES之前需要创建一个client, ES请求都是通过client发送,通过client可以配置ES的服务地址、安全验证相关参数。  | |||
* 通常全局创建一个client即可;  | |||
<syntaxhighlight lang="Java" highlight="">  | |||
RestHighLevelClient client = new RestHighLevelClient(  | |||
        RestClient.builder(  | |||
                new HttpHost("localhost", 9200, "http"),  | |||
                new HttpHost("localhost", 9201, "http")));  | |||
</syntaxhighlight>  | |||
client内部维护了连接池,因此在不使用client的时候需要通过下面方式释放资源。  | |||
<syntaxhighlight lang="Java" highlight="">  | |||
client.close();  | |||
</syntaxhighlight>  | |||
=== 创建索引 ===  | |||
<syntaxhighlight lang="Java" highlight="">  | |||
// 创建Request对象, 准备创建的索引名为twitter  | |||
CreateIndexRequest request = new CreateIndexRequest("twitter");   | |||
// 设置Request参数  | |||
request.settings(Settings.builder()   | |||
    .put("index.number_of_shards", 3) // 设置分区数  | |||
    .put("index.number_of_replicas", 2) // 设置副本数  | |||
);  | |||
// 通过JSON字符串的方式,设置ES索引结构的mapping  | |||
// ps: 通常都是通过json配置文件加载索引mapping配置,不需要拼接字符串。  | |||
request.mapping(  | |||
        "{\n" +  | |||
        "  \"properties\": {\n" +  | |||
        "    \"message\": {\n" +  | |||
        "      \"type\": \"text\"\n" +  | |||
        "    }\n" +  | |||
        "  }\n" +  | |||
        "}",   | |||
        XContentType.JSON);  | |||
// 执行请求,创建索引  | |||
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);  | |||
if (createIndexResponse.isAcknowledged()) {  | |||
   // 创建成功  | |||
}   | |||
</syntaxhighlight>  | |||
=== 插入数据 ===  | |||
<syntaxhighlight lang="Java" highlight="">  | |||
// 创建对应的Request请求,设置索引名为posts  | |||
IndexRequest request = new IndexRequest("posts");   | |||
// 设置文档id=1  | |||
request.id("1");   | |||
// 以json字符串的形式设置文档内容,也就是准备插入到ES中的数据  | |||
String jsonString = "{" +  | |||
        "\"user\":\"kimchy\"," +  | |||
        "\"postDate\":\"2013-01-30\"," +  | |||
        "\"message\":\"trying out Elasticsearch\"" +  | |||
        "}";  | |||
request.source(jsonString, XContentType.JSON);  | |||
// 执行请求  | |||
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);  | |||
</syntaxhighlight>  | |||
=== 查询数据 ===  | |||
根据id查询一条数据:  | |||
<syntaxhighlight lang="Java" highlight="">  | |||
// 创建对应的Request对象,设置索引名为posts, 文档id=1  | |||
GetRequest getRequest = new GetRequest("posts", "1");  | |||
// 执行ES请求  | |||
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);  | |||
// 处理查询结果  | |||
String index = getResponse.getIndex();  | |||
String id = getResponse.getId();  | |||
// 检查文档是否存在  | |||
if (getResponse.isExists()) {  | |||
    long version = getResponse.getVersion();  | |||
    // 获取文档数据的json字符串形式,可以使用json库转换成Java对象  | |||
    String sourceAsString = getResponse.getSourceAsString();  | |||
    // 获取文档数据的Map形式   | |||
    Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();  | |||
    // 获取文档数据的字节数组形式  | |||
    byte[] sourceAsBytes = getResponse.getSourceAsBytes();  | |||
} else {  | |||
    // 文档不存在  | |||
}  | |||
</syntaxhighlight>  | |||
=== 更新数据 ===  | |||
<syntaxhighlight lang="Java" highlight="">  | |||
// 创建对应的Request对象,设置索引名为posts, 文档id=1  | |||
UpdateRequest request = new UpdateRequest("posts", "1");  | |||
// 以map形式,设置需要更新的文档字段  | |||
Map<String, Object> jsonMap = new HashMap<>();  | |||
jsonMap.put("updated", new Date());  | |||
jsonMap.put("reason", "daily update");  | |||
request.doc(jsonMap);   | |||
// 执行请求  | |||
UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);  | |||
</syntaxhighlight>  | |||
=== 删除数据 ===  | |||
<syntaxhighlight lang="Java" highlight="">  | |||
// 创建对应的Request对象,设置索引名为posts, 文档id=1  | |||
DeleteRequest request = new DeleteRequest("posts", "1");   | |||
// 执行请求  | |||
DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);  | |||
</syntaxhighlight>  | </syntaxhighlight>  | ||
2023年3月31日 (五) 22:03的最新版本
关于
相关内容基于 ES 官方的 Java REST Client(老的Java API 在 ES 7.0.0 以后废弃,不推荐使用)。
- 支持 Elasticsearch 5.6.x 以上。
 - Java 1.8 以上。
 
Maven配置:
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.8.1</version>
</dependency>
- 可以根据自己的 ES 版本选择对应的 Java REST Client 版本。
 
连接配置
Java Elasticsearch RestHighLevelClient 的配置详情。
- 请求都是通过 RestHighLevelClient 实例发出去的;
 
RestHighLevelClient常用配置如下:
- elasticsearch连接地址
 - elasticsearch账号/密码
 - Http请求头
 - 连接超时
 - 设置线程池大小
 
创建client
RestHighLevelClient 依赖 REST low-level client builder 进行配置,即依赖底层的 RestClientBuilder 对象进行参数设置:
// 首先创建RestClientBuilder,后续章节通过RestClientBuilder对象进行参数配置。
RestClientBuilder restClientBuilder = RestClient.builder(
                new HttpHost("localhost", 9200, "http"), // 设置ES服务地址,支持多个
                new HttpHost("localhost", 9201, "http"));
// 创建 RestHighLevelClient,请求都是通过 RestHighLevelClient 实例发出去的。
RestHighLevelClient client = new RestHighLevelClient(restClientBuilder);
配置ES账号密码
restClientBuilder.setHttpClientConfigCallback(
    new RestClientBuilder.HttpClientConfigCallback() {
        @Override
        public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
            // 通过CredentialsProvider实例,配置账号和密码
            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("user", "password"));
            // 设置安全验证凭证
            return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
        }
    });
设置Http Header
// 创建header数组,可以设置多个header
Header[] defaultHeaders = new Header[]{new BasicHeader("header", "value")};
// 设置http header
restClientBuilder.setDefaultHeaders(defaultHeaders);
Timeout设置
restClientBuilder.setRequestConfigCallback(
    new RestClientBuilder.RequestConfigCallback() {
        @Override
        public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
            return requestConfigBuilder
                .setConnectTimeout(5000) // 设置连接超时时间,5秒
                .setSocketTimeout(60000); // 设置请求超时时间,1分种
        }
    });
设置线程池大小
restClientBuilder.setHttpClientConfigCallback(
    new RestClientBuilder.HttpClientConfigCallback() {
        @Override
        public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
            return httpClientBuilder.setDefaultIOReactorConfig(
                                IOReactorConfig.custom()
                                    .setIoThreadCount(10) // 设置线程数
                                    .build());
        }
});
快速入门
创建客户端
在操作ES之前需要创建一个client, ES请求都是通过client发送,通过client可以配置ES的服务地址、安全验证相关参数。
- 通常全局创建一个client即可;
 
RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http"),
                new HttpHost("localhost", 9201, "http")));
client内部维护了连接池,因此在不使用client的时候需要通过下面方式释放资源。
client.close();
创建索引
// 创建Request对象, 准备创建的索引名为twitter
CreateIndexRequest request = new CreateIndexRequest("twitter"); 
// 设置Request参数
request.settings(Settings.builder() 
    .put("index.number_of_shards", 3) // 设置分区数
    .put("index.number_of_replicas", 2) // 设置副本数
);
// 通过JSON字符串的方式,设置ES索引结构的mapping
// ps: 通常都是通过json配置文件加载索引mapping配置,不需要拼接字符串。
request.mapping(
        "{\n" +
        "  \"properties\": {\n" +
        "    \"message\": {\n" +
        "      \"type\": \"text\"\n" +
        "    }\n" +
        "  }\n" +
        "}", 
        XContentType.JSON);
// 执行请求,创建索引
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
if (createIndexResponse.isAcknowledged()) {
   // 创建成功
}
插入数据
// 创建对应的Request请求,设置索引名为posts
IndexRequest request = new IndexRequest("posts"); 
// 设置文档id=1
request.id("1"); 
// 以json字符串的形式设置文档内容,也就是准备插入到ES中的数据
String jsonString = "{" +
        "\"user\":\"kimchy\"," +
        "\"postDate\":\"2013-01-30\"," +
        "\"message\":\"trying out Elasticsearch\"" +
        "}";
request.source(jsonString, XContentType.JSON);
// 执行请求
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
查询数据
根据id查询一条数据:
// 创建对应的Request对象,设置索引名为posts, 文档id=1
GetRequest getRequest = new GetRequest("posts", "1");
// 执行ES请求
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
// 处理查询结果
String index = getResponse.getIndex();
String id = getResponse.getId();
// 检查文档是否存在
if (getResponse.isExists()) {
    long version = getResponse.getVersion();
    
    // 获取文档数据的json字符串形式,可以使用json库转换成Java对象
    String sourceAsString = getResponse.getSourceAsString();
    // 获取文档数据的Map形式 
    Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
    // 获取文档数据的字节数组形式
    byte[] sourceAsBytes = getResponse.getSourceAsBytes();
} else {
    // 文档不存在
}
更新数据
// 创建对应的Request对象,设置索引名为posts, 文档id=1
UpdateRequest request = new UpdateRequest("posts", "1");
// 以map形式,设置需要更新的文档字段
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("updated", new Date());
jsonMap.put("reason", "daily update");
request.doc(jsonMap); 
// 执行请求
UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
删除数据
// 创建对应的Request对象,设置索引名为posts, 文档id=1
DeleteRequest request = new DeleteRequest("posts", "1"); 
// 执行请求
DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);