1. 生态
Elasticsearch 使用的是 8.5.0版本的
2.构建API对象
//创建低级容器
BasicCredentialsProvider credent = new BasicCredentialsProvider();
credent.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("账号","密码"));
RestClient client=RestClient.builder(new HttpHost("localhost", 9200))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
return httpAsyncClientBuilder.setDefaultCredentialsProvider(credent);
}
}).build();
//使用JSON映射器传输数据
RestClientTransport restClientTransport = new RestClientTransport(client, new JacksonJsonpMapper());
//创建API客户端
ElasticsearchClient client = new ElasticsearchClient(restClientTransport);
3.索引的一些基本操作
索引的添加删除查找都是基于client中的indices()来进行的,英语里面是index的复数,这样好理解点
3.1添加索引
CreateIndexResponse demo = client.indices().create(c -> c.index("demo"));
3.2 获取索引
//这里获取的是一个名字是 demo的索引
GetIndexResponse shopping = client.indices().get(i -> i.index("demo"));
System.out.println(shopping);
//获取全部索引
IndicesResponse shopping = client.cat().indices();
shopping.valueBody().forEach(e-> System.out.println(e));
3.2 删除索引
DeleteIndexResponse demo = client.indices().delete(delete -> delete.index("demo"));
4. 文档的一些基本操作
4.1 通过文档id获取
/*第一个参数是实际请求
第二个参数是我们希望文档的 JSON 映射到的类。*/
GetResponse<Demo> demoResponse= client.get(g -> g
.index("demo")
.id("1")
, Demo.class);
System.out.println(demoResponse);
4.2 获取当前索引的全部文档
SearchResponse<Shopping> shopping = client.search(g -> g
.index("shopping")
, Shopping.class);
HitsMetadata<Shopping> hits = shopping.hits();
for (Hit<Shopping> hit : hits.hits()) {
System.out.println(hit.source());
}
4.3 添加文档
index:是索引的名称
id:是给文档的id
document:是这个文档的数据
//单个添加
//给索引创建文档
IndexResponse index = client.index(i -> i
.index("demo")
.id("10004")
.document(new Demo("8888", 24))
);
//批量创建
BulkRequest.Builder br = new BulkRequest.Builder();
for (Demo demo : demoList) {
br.operations(op->op
.index(idx->idx
.index("shopping")
.id(demo.id)
.document(demo )
)
);
}
BulkResponse result = client.bulk(br.build());
// 记录错误(如果有的话)
if (result.errors()) {
System.out.println("Bulk had errors");
for (BulkResponseItem item: result.items()) {
if (item.error() != null) {
System.out.println(item.error().reason());
}
}
}
5 搜索
5.1 简单搜索查询
在查询时需要对一些数据进行筛选
match:会进行分词
field:需要筛选的字段
query:筛选的条件
默认会把匹配条件高的数据放在最前面
SearchResponse<Demo> search = client.search(s -> s
.index("demo")
.query(q -> q
.match(t -> t
.field("name")
.query("8888李")
)
),
Demo.class
);
search.hits().hits().forEach(e->{
System.out.println(e);
});
5.2 嵌套搜索查询
如果筛选的条件有多个可以进行组合
//name带李的
Query byName = MatchQuery.of(m -> m
.field("name")
.query("李")
)._toQuery();
//年龄等于15的
Query byAge = MatchQuery.of(m -> m
.field("age")
.query(15)
)._toQuery();
//集合姓名和年龄的搜索结果
SearchResponse<Demo> demo= client.search(s -> s
.index("shopping")
.query(q -> q
.bool(b -> b
.must(byName)
.must(byAge)
)
)
, Demo.class);
shopping.hits().hits().forEach(e-> System.out.println(e));
小白记录一下,如果哪里有错误支持指正!!!