简介:本文详细介绍Elasticsearch搜索引擎的Java集成方案,涵盖下载安装、基础配置、API调用及性能优化,为开发者提供从环境搭建到高级应用的完整指南。
Elasticsearch作为基于Lucene的分布式搜索与分析引擎,凭借其近实时搜索、分布式架构和RESTful API特性,已成为企业级搜索解决方案的首选。Java开发者选择Elasticsearch的核心优势在于:
典型应用场景包括电商商品搜索、日志分析系统、安全事件监控等,这些场景均需要毫秒级响应和水平扩展能力。
# Linux/macOS示例wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.12.0-linux-x86_64.tar.gztar -xzf elasticsearch-8.12.0-linux-x86_64.tar.gz
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 \-e "discovery.type=single-node" \-e "xpack.security.enabled=false" \docker.elastic.co/elasticsearch/elasticsearch:8.12.0
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic.gpgecho "deb [signed-by=/usr/share/keyrings/elastic.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.listsudo apt update && sudo apt install elasticsearch
jvm.options文件设置堆内存(建议不超过物理内存的50%)discovery.seed_hosts
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>8.12.0</version></dependency><!-- Spring Boot集成 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>3.1.0</version></dependency>
// 基础客户端创建RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));// 带认证的客户端final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("elastic", "changeme"));RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200)).setHttpClientConfigCallback(httpClientBuilder ->httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
// 创建索引CreateIndexRequest request = new CreateIndexRequest("products");request.settings(Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 2));client.indices().create(request, RequestOptions.DEFAULT);// 删除索引DeleteIndexRequest deleteRequest = new DeleteIndexRequest("products");client.indices().delete(deleteRequest, RequestOptions.DEFAULT);
// 索引文档IndexRequest indexRequest = new IndexRequest("products").id("1").source(XContentType.JSON, "name", "Laptop", "price", 999.99);IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);// 搜索文档SearchRequest searchRequest = new SearchRequest("products");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.matchQuery("name", "Laptop"));searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 自定义连接池PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(100);connectionManager.setDefaultMaxPerRoute(20);RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200)).setHttpClientConfigCallback(httpClientBuilder ->httpClientBuilder.setConnectionManager(connectionManager));
连接拒绝:
curl -X GET "localhost:9200/_cluster/health?pretty"thread_pool.search.size: 30内存溢出:
-Xms4g -Xmx4gindices.fielddata.cache.size: 20%搜索延迟:
preference参数控制分片路由request_cache:"request_cache": true
SearchRequest searchRequest = new SearchRequest("orders");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.aggregation(AggregationBuilders.terms("by_category").field("category.keyword").subAggregation(AggregationBuilders.avg("avg_price").field("price")));searchRequest.source(sourceBuilder);
// 创建包含向量的索引CreateIndexRequest request = new CreateIndexRequest("images");request.mapping("{\"properties\": {\"image_vector\": {\"type\": \"dense_vector\", \"dims\": 128}}}",XContentType.JSON);// 相似度搜索ScriptScoreQueryBuilder scriptScoreQuery = QueryBuilders.scriptScoreQuery(QueryBuilders.matchAllQuery(),new Script("cosineSimilarity(params.query_vector, 'image_vector') + 1.0"));SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(scriptScoreQuery);
client.close()BulkRequest处理批量数据,建议每批1000-5000个文档_nodes/statsAPI监控客户端性能通过系统掌握Elasticsearch的Java集成方案,开发者能够构建出高性能、可扩展的搜索解决方案。建议从基础CRUD操作开始实践,逐步深入聚合分析、向量搜索等高级特性,同时结合实际业务场景进行性能调优。