Rest Client操作向量索引示例
更新时间:2024-02-27
本文基于Java High Level REST Client 7.x 和 Java Low Level REST Client 7.x 版本,为您介绍Elasticsearch Java API的用法。
准备工作
- 安装Java,要求JDK版本为1.8及以上。
-
创建Baidu Elasticsearch实例,版本7.10.2。
采用 High Level Client 进行创建索引,写入数据,refresh 以及 删除索引操作, 采用 Low Level Client 执行检索数据操作。
注意 High Level Client能够向上兼容,但为了保证最大程度地使用最新版客户端的特性,推荐High Level Client版本与集群版本一致。
注意 Low Level Client能够与任何版本的Elasticsearch兼容,因此客户端版本可以为任何版本,本文以7.10.2版本为例。
- 创建Java Maven工程,并将如下的pom依赖添加到Java工程的pom.xml文件中。
pom依赖
XML
1<dependency>
2 <groupId>org.elasticsearch.client</groupId>
3 <artifactId>elasticsearch-rest-high-level-client</artifactId>
4 <version>7.10.2</version>
5</dependency>
6<dependency>
7 <groupId>org.apache.logging.log4j</groupId>
8 <artifactId>log4j-core</artifactId>
9 <version>2.7</version>
10</dependency>
11<dependency>
12 <groupId>org.apache.logging.log4j</groupId>
13 <artifactId>log4j-api</artifactId>
14 <version>2.7</version>
15</dependency>
16<dependency>
17 <groupId>org.elasticsearch.client</groupId>
18 <artifactId>elasticsearch-rest-client</artifactId>
19 <version>7.10.2</version>
20</dependency>
21<dependency>
22 <groupId>org.apache.httpcomponents</groupId>
23 <artifactId>httpasyncclient</artifactId>
24 <version>4.1.4</version>
25</dependency>
26<dependency>
27 <groupId>org.apache.httpcomponents</groupId>
28 <artifactId>httpcore-nio</artifactId>
29 <version>4.4.13</version>
30</dependency>
31<dependency>
32 <groupId>org.apache.httpcomponents</groupId>
33 <artifactId>httpclient</artifactId>
34 <version>4.5.6</version>
35</dependency>
36<dependency>
37 <groupId>org.apache.httpcomponents</groupId>
38 <artifactId>httpcore</artifactId>
39 <version>4.4.12</version>
40</dependency>
示例
以下示例采用 High Level Client 执行创建索引操作、写入数据、refresh 操作以及删除索引操作, 采用 Low Level Client 执行检索数据操作,可供参考。
Java
1import org.apache.http.HttpHost;
2import org.apache.http.auth.AuthScope;
3import org.apache.http.auth.UsernamePasswordCredentials;
4import org.apache.http.client.CredentialsProvider;
5import org.apache.http.entity.ContentType;
6import org.apache.http.impl.client.BasicCredentialsProvider;
7import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
8import org.apache.http.nio.entity.NStringEntity;
9import org.apache.http.util.EntityUtils;
10import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
11import org.elasticsearch.action.admin.indices.refresh.RefreshRequest;
12import org.elasticsearch.action.admin.indices.refresh.RefreshResponse;
13import org.elasticsearch.action.bulk.BulkRequest;
14import org.elasticsearch.action.bulk.BulkResponse;
15import org.elasticsearch.action.index.IndexRequest;
16import org.elasticsearch.action.support.master.AcknowledgedResponse;
17import org.elasticsearch.client.RestClient;
18import org.elasticsearch.client.RestClientBuilder;
19import org.elasticsearch.client.RestHighLevelClient;
20import org.elasticsearch.client.RequestOptions;
21import org.elasticsearch.client.Request;
22import org.elasticsearch.client.Response;
23import org.elasticsearch.client.indices.CreateIndexRequest;
24import org.elasticsearch.client.indices.CreateIndexResponse;
25import org.elasticsearch.common.settings.Settings;
26import org.elasticsearch.common.xcontent.XContentBuilder;
27import org.elasticsearch.common.xcontent.XContentFactory;
28import org.elasticsearch.common.xcontent.XContentType;
29
30import java.io.IOException;
31import java.util.Random;
32
33public class RestClientTest710 {
34
35 public static void main(String[] args) {
36 final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
37 //访问用户名和密码为您创建Elasticsearch实例时设置的用户名和密码。
38 credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{访问用户名}", "{访问密码}"));
39 // 通过builder创建high level rest client,配置http client的HttpClientConfigCallback。
40 // ES HTTP URL 在Baidu Elasticsearch界面中可以查询
41 RestClientBuilder builder = RestClient.builder(new HttpHost("{ES HTTP URL}", 8200))
42 .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
43 @Override
44 public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
45 return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
46 }
47 });
48
49 // RestHighLevelClient实例通过REST low-level client builder进行构造。
50 RestHighLevelClient client = new RestHighLevelClient(builder);
51
52 // 通过 restClient 进行查询操作
53 RestClient restClient = RestClient.builder(new HttpHost("{ES HTTP URL}", 8200))
54 .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
55 @Override
56 public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
57 return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
58 }
59 }).build();
60
61 try {
62 //创建索引
63 CreateIndexRequest createRequest = new CreateIndexRequest("my_index_vec");
64
65 //创建的每个索引都可以有与之关联的特定设置。
66 createRequest.settings(Settings.builder()
67 .put("index.number_of_shards", 2)
68 .put("index.number_of_replicas", 1)
69 .put("index.refresh_interval", "10s")
70 .put("knn", true)
71 );
72 // 创建索引时创建文档类型映射
73 createRequest.mapping(
74 "{\n" +
75 " \"properties\": {\n" +
76 " \"id\": {\n" +
77 " \"type\": \"long\"\n" +
78 " },\n" +
79 " \"field_hnsw\": {\n" +
80 " \"type\": \"bpack_vector\",\n" +
81 " \"index_type\": \"hnsw\",\n" +
82 " \"dims\": 8,\n" +
83 " \"space_type\": \"l2\",\n" +
84 " \"parameters\": {\n" +
85 " \"m\": 32,\n" +
86 " \"ef_construction\": 256\n" +
87 " }\n" +
88 " }\n" +
89 " }\n" +
90 "}",
91 XContentType.JSON);
92
93 // 同步执行创建索引操作
94 CreateIndexResponse createIndexResponse = client.indices().create(createRequest, RequestOptions.DEFAULT);
95 System.out.println("create index successfully! response : " + createIndexResponse.toString());
96
97 // 批次写入文档
98 BulkRequest bulkRequest = new BulkRequest();
99 for (int i = 0; i < 100; i++) {
100 // 以XContentBuilder对象的形式提供,Elasticsearch 内部会帮我们生成JSON内容
101 XContentBuilder jsonBuilder = XContentFactory.jsonBuilder();
102
103 jsonBuilder.startObject();
104 {
105 jsonBuilder.field("id", i);
106 jsonBuilder.field("field_hnsw", RandomVector(8));
107 }
108 jsonBuilder.endObject();
109 bulkRequest.add(new IndexRequest("my_index_vec").source(jsonBuilder));
110 }
111 BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
112 System.out.println("bulk success ! response : " + bulkResponse.toString());
113
114 //数据写入后会过一定时间触发自动的refresh构建向量索引,手动执行refresh保证可以立即查询
115 RefreshRequest refreshRequest = new RefreshRequest("my_index_vec");
116 RefreshResponse refreshResponse = client.indices().refresh(refreshRequest, RequestOptions.DEFAULT);
117 System.out.println("refresh success ! response : " + refreshResponse.toString());
118
119 // 检索向量数据
120 // 创建检索request
121 Request request = new Request(
122 "POST",
123 "/my_index_vec/_search");
124 // 配置请求体
125 request.setEntity(new NStringEntity("{\n" +
126 " \"size\": 5, \n" +
127 " \"_source\": [\"id\"], \n" +
128 " \"query\": {\n" +
129 " \"knn\": { \n" +
130 " \"field_hnsw\": { \n" +
131 " \"vector\": [0.2, 0.3, 0.5, 0.6, 0.7, 0.8, 0.9 ,0.1], \n" +
132 " \"k\": 10, \n" +
133 " \"ef\": 256 \n" +
134 " }\n" +
135 " }\n" +
136 " }\n" +
137 "}", ContentType.APPLICATION_JSON));
138 // 发送检索请求
139 Response response = restClient.performRequest(request);
140 System.out.println(EntityUtils.toString(response.getEntity()));
141
142 // 指定要删除的索引名称
143 DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("my_index_vec");
144 // 执行删除索引操作
145 AcknowledgedResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
146 System.out.println("delete index successfully! response : " + deleteIndexResponse.toString());
147 } catch (IOException ioException) {
148 // 异常处理。
149 ioException.printStackTrace();
150 } finally {
151 // 在不需要使用client后,将client关闭。
152 try {
153 client.close();
154 restClient.close();
155 } catch (IOException e) {
156 e.printStackTrace();
157 }
158 }
159 }
160
161 // 生成指定维度随机向量
162 public static float[] RandomVector(int dim) {
163 float[] vec = new float[dim];
164 Random random = new Random();
165
166 // 随机生成数组元素
167 for (int i = 0; i < dim; i++) {
168 vec[i] = random.nextFloat(1);
169 }
170 return vec;
171 }
172}
以上示例代码中带{}
的参数需要替换为您具体业务的参数,详情请参见代码注释。
更多Java High Level REST Client的使用特性,请参见Java High Level REST Client官方文档。 更多Java Low Level REST Client的使用特性,请参见Java Low Level REST Client官方文档。