Elasticsearch集成:搜索与分析
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. 最佳实践
- 使用合适的索引策略:合理设计索引结构
- 优化查询性能:使用合适的查询方式
- 管理索引生命周期:定期清理旧索引
- 监控集群状态:监控Elasticsearch集群状态
- 备份数据:定期备份索引数据
总结
Elasticsearch是分布式搜索和分析引擎。掌握Java与Elasticsearch的集成,可以实现高效的搜索和数据分析功能。