Elasticsearch 实战

159 阅读1分钟

实战

  1. 安装
  2. 插入文档
  3. 查找文档
  4. 分析文档

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());
}