← 返回首页
🔍

Elasticsearch集成:搜索与分析

📂 java ⏱ 2 min 260 words

Elasticsearch集成:搜索与分析

概述

Elasticsearch是分布式搜索和分析引擎。本教程介绍Java与Elasticsearch的集成。

1. Spring Data Elasticsearch

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

@Document(indexName = "products")
public class Product {
    @Id
    private String id;
    private String name;
    private String description;
    private double price;
    private String category;
    
    // 构造方法和getter/setter
}

public interface ProductRepository extends ElasticsearchRepository<Product, String> {
    List<Product> findByName(String name);
    List<Product> findByCategory(String category);
    List<Product> findByPriceBetween(double min, double max);
    List<Product> findByDescriptionContaining(String keyword);
}

2. 使用RestHighLevelClient

import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;

@Service
public class ElasticsearchService {
    private final RestHighLevelClient client;
    
    public List<Product> search(String keyword) {
        try {
            SearchRequest request = new SearchRequest("products");
            request.source(new SearchSourceBuilder()
                .query(QueryBuilders.multiMatchQuery(keyword, "name", "description"))
                .size(10));
            
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            
            List<Product> products = new ArrayList<>();
            for (SearchHit hit : response.getHits()) {
                products.add(objectMapper.readValue(hit.getSourceAsString(), Product.class));
            }
            
            return products;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

3. 实际应用示例

商品搜索

@RestController
@RequestMapping("/api/search")
public class SearchController {
    private final ElasticsearchService elasticsearchService;
    
    @GetMapping("/products")
    public List<Product> searchProducts(@RequestParam String keyword) {
        return elasticsearchService.search(keyword);
    }
    
    @GetMapping("/products/filter")
    public List<Product> filterProducts(
            @RequestParam(required = false) String category,
            @RequestParam(required = false) Double minPrice,
            @RequestParam(required = false) Double maxPrice) {
        return elasticsearchService.filter(category, minPrice, maxPrice);
    }
}

日志分析

@Document(indexName = "logs")
public class LogEntry {
    @Id
    private String id;
    private String level;
    private String message;
    private String service;
    private LocalDateTime timestamp;
    
    // 构造方法和getter/setter
}

@Service
public class LogAnalysisService {
    public Map<String, Long> countByLevel() {
        // 统计各级别日志数量
        return logRepository.countByLevel();
    }
    
    public List<LogEntry> searchLogs(String keyword, LocalDateTime startTime, LocalDateTime endTime) {
        // 搜索日志
        return logRepository.findByMessageContainingAndTimestampBetween(keyword, startTime, endTime);
    }
}

4. 最佳实践

  1. 使用合适的索引策略:合理设计索引结构
  2. 优化查询性能:使用合适的查询方式
  3. 管理索引生命周期:定期清理旧索引
  4. 监控集群状态:监控Elasticsearch集群状态
  5. 备份数据:定期备份索引数据

总结

Elasticsearch是分布式搜索和分析引擎。掌握Java与Elasticsearch的集成,可以实现高效的搜索和数据分析功能。