Elasticsearch介绍
Elasticsearch(简称ES)是一个开源的分布式搜索和分析引擎,它被用于全文搜索、结构化搜索、分析以及这些数据的存储。Elasticsearch 是基于 Apache Lucene 的搜索引擎,提供了一个分布式多租户能力的全文搜索引擎,通过 RESTful API 进行操作。
Elasticsearch常用于日志和事务数据分析、全文搜索应用、结构化数据的搜索分析以及安全智能等领域。在大数据领域,Elasticsearch与Hadoop、Spark等大数据处理工具的结合使用,可以实现更为复杂的数据分析和处理任务。
Elasticsearch具有以下特点:
- 分布式:Elasticsearch是一个分布式系统,可以轻松地扩展到多个节点,实现高可用性和横向扩展。
- 实时性:Elasticsearch能够实时地索引和搜索数据,支持快速的数据检索和分析。
- 文档型存储:Elasticsearch以文档的形式存储数据,每个文档都是一个JSON对象。
- 强大的搜索功能:Elasticsearch提供丰富的搜索功能,包括全文搜索、聚合分析、地理空间搜索等。
- 多语言支持:Elasticsearch支持多种编程语言的客户端,方便与各种应用集成。
- 可扩展性:Elasticsearch提供丰富的插件和API,可以根据需求进行定制和扩展。
- 开放源代码:Elasticsearch是开源的,拥有活跃的社区支持和持续的更新和改进。
Elasticsearch主要用途场景:
- 实时搜索引擎:Elasticsearch可以用于构建实时搜索引擎,支持快速的全文搜索和相关性排序,适用于各种类型的数据搜索,如文档、日志、产品信息等。
- 日志和指标分析:Elasticsearch可以用于存储和分析大量的日志数据和指标数据,支持快速的数据检索和聚合分析,适用于监控系统、日志分析、性能分析等场景。
- 全文搜索引擎:Elasticsearch支持复杂的全文搜索功能,包括分词、语言分析、相关性评分等,适用于构建全文搜索引擎和文档检索系统。
- 实时数据分析:Elasticsearch可以用于实时的数据分析和可视化,支持复杂的数据聚合和可视化展示,适用于业务数据分析、实时监控等场景。
Elasticsearch使用
- 添加Elasticsearch依赖:在项目的pom.xml文件中添加Elasticsearch的依赖:
<dependencies> <!-- Spring Data Elasticsearch --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <!-- Elasticsearch的REST客户端 --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency> </dependencies>
- 配置Elasticsearch连接:在application.properties或application.yml文件中配置Elasticsearch的连接信息:
spring: data: elasticsearch: cluster-nodes: localhost:9200
- 创建实体类:创建与Elasticsearch索引对应的实体类,使用@Document注解进行标记:
@Document(indexName = "product", createIndex = false) public class Product { @Id private String id; @Field(type = FieldType.Text, fielddata = true) private String name; @Field(type = FieldType.Keyword) private String category; @Field(type = FieldType.Float) private float price; public Product() { } public Product(String id, String name, String category, float price) { this.id = id; this.name = name; this.category = category; this.price = price; } // getter和setter方法 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } }
- 创建ElasticsearchRepository:创建一个继承自ElasticsearchRepository的接口,用于定义Elasticsearch的操作:
public interface ProductRepository extends ElasticsearchRepository<Product, String> { // 根据名称查找产品 Iterable<Product> findByName(String name); }
- 编写业务逻辑:在业务逻辑中使用ElasticsearchRepository来操作Elasticsearch的数据:
@Service public class ProductService { @Autowired private ProductRepository productRepository; public Product saveProduct(Product product) { return productRepository.save(product); } public List<Product> findAllProducts() { return productRepository.findAll(); } public List<Product> findProductByName(String name) { return (List<Product>) productRepository.findByName(name); } public void deleteProduct(String id) { productRepository.deleteById(id); } }
- 在Controller中调用服务:
@RestController @RequestMapping("/products") public class ProductController { @Autowired private ProductService productService; @PostMapping public Product saveProduct(@RequestBody Product product) { return productService.saveProduct(product); } @GetMapping public List<Product> getAllProducts() { return productService.findAllProducts(); } @GetMapping("/name/{name}") public List<Product> getProductByName(@PathVariable String name) { return productService.findProductByName(name); } @DeleteMapping("/{id}") public void deleteProduct(@PathVariable String id) { productService.deleteProduct(id); } }
在实际使用中对于更复杂的查询和高级功能,需要利用Elasticsearch的更高级特性,例如分页、排序、聚合等,编写自定义的查询方法或使用Elasticsearch的原生查询DSL。
原文地址:https://mp.weixin.qq.com/s/bANP-I84MR2Cn_UQ5s4r2g