实战
- 安装
- 插入文档
- 查找文档
- 分析文档
1. 准备阶段
1.1 安装
docker pull elasticsearch:8.6.2
docker network create elastic
docker run -d --name elasticsearch --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms2g -Xmx2g" elasticsearch:8.6.2
进入容器:
docker exec -it elasticsearch /bin/bash
重置密码
elasticsearch-reset-password -u elastic
拿到指纹
openssl x509 -fingerprint -sha256 -in config/certs/http_ca.crt
1.2 依赖
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.6.2</version>
</dependency>
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
1.3 客户端配置
@Configuration
public class ElasticsearchConfig {
@Bean
public ElasticsearchClient elasticsearchClient() {
//通过 openssl x509 -fingerprint -sha256 -in config/certs/http_ca.crt 拿到指纹
String fingerprint = "";
SSLContext sslContext = TransportUtils.sslContextFromCaFingerprint(fingerprint);
//通过 elasticsearch-reset-password -u elastic 重置密码
BasicCredentialsProvider credsProv = new BasicCredentialsProvider();
credsProv.setCredentials(
AuthScope.ANY, new UsernamePasswordCredentials("elastic", "")
);
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "https")
).setHttpClientConfigCallback(
hc -> hc.setSSLContext(sslContext)
.setDefaultCredentialsProvider(credsProv)
).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
return new ElasticsearchClient(transport);
}
}
2. 插入文档
2.1 插入单个文档
Product product = new Product("bk-1", "City bike", 123.0);
IndexResponse response = esClient.index(i -> i
.index("products")
.id(product.getSku())
.document(product)
);
2.2 批量插入
List<Product> products = fetchProducts();
BulkRequest.Builder br = new BulkRequest.Builder();
for (Product product : products) {
br.operations(op -> op
.index(idx -> idx
.index("products")
.id(product.getSku())
.document(product)
)
);
}
BulkResponse result = esClient.bulk(br.build());
3. 全文检索
String keyword = "";
String index = "products";
SearchResponse<Product> response = client.search(s -> s.index(index).q(keyword), Product.class);
response.hits().hits().forEach(System.out::println);
4. 数据分析
String searchText = "bike";
Query query = MatchQuery.of(m -> m
.field("name")
.query(searchText)
)._toQuery();
SearchResponse<Void> response = esClient.search(b -> b
.index("products")
.size(0)
.query(query)
.aggregations("price-histogram", a -> a
.histogram(h -> h
.field("price")
.interval(50.0)
)
),
Void.class
);
List<HistogramBucket> buckets = response.aggregations()
.get("price-histogram")
.histogram()
.buckets().array();
for (HistogramBucket bucket: buckets) {
logger.info("There are " + bucket.docCount() +
" bikes under " + bucket.key());
}