Elasticsearch-分布式搜索与分析引擎
创始人
2025-07-14 14:31:26
0

Elasticsearch介绍

Elasticsearch(简称ES)是一个开源的分布式搜索和分析引擎,它被用于全文搜索、结构化搜索、分析以及这些数据的存储。Elasticsearch 是基于 Apache Lucene 的搜索引擎,提供了一个分布式多租户能力的全文搜索引擎,通过 RESTful API 进行操作。

Elasticsearch常用于日志和事务数据分析、全文搜索应用、结构化数据的搜索分析以及安全智能等领域。在大数据领域,Elasticsearch与Hadoop、Spark等大数据处理工具的结合使用,可以实现更为复杂的数据分析和处理任务。

Elasticsearch具有以下特点:

  1. 分布式:Elasticsearch是一个分布式系统,可以轻松地扩展到多个节点,实现高可用性和横向扩展。
  2. 实时性:Elasticsearch能够实时地索引和搜索数据,支持快速的数据检索和分析。
  3. 文档型存储:Elasticsearch以文档的形式存储数据,每个文档都是一个JSON对象。
  4. 强大的搜索功能:Elasticsearch提供丰富的搜索功能,包括全文搜索、聚合分析、地理空间搜索等。
  5. 多语言支持:Elasticsearch支持多种编程语言的客户端,方便与各种应用集成。
  6. 可扩展性:Elasticsearch提供丰富的插件和API,可以根据需求进行定制和扩展。
  7. 开放源代码:Elasticsearch是开源的,拥有活跃的社区支持和持续的更新和改进。

Elasticsearch主要用途场景:

  1. 实时搜索引擎:Elasticsearch可以用于构建实时搜索引擎,支持快速的全文搜索和相关性排序,适用于各种类型的数据搜索,如文档、日志、产品信息等。
  2. 日志和指标分析:Elasticsearch可以用于存储和分析大量的日志数据和指标数据,支持快速的数据检索和聚合分析,适用于监控系统、日志分析、性能分析等场景。
  3. 全文搜索引擎:Elasticsearch支持复杂的全文搜索功能,包括分词、语言分析、相关性评分等,适用于构建全文搜索引擎和文档检索系统。
  4. 实时数据分析:Elasticsearch可以用于实时的数据分析和可视化,支持复杂的数据聚合和可视化展示,适用于业务数据分析、实时监控等场景。

Elasticsearch使用

  1. 添加Elasticsearch依赖:在项目的pom.xml文件中添加Elasticsearch的依赖:
  
      
      
        org.springframework.boot  
        spring-boot-starter-data-elasticsearch  
      
      
      
      
        org.elasticsearch.client  
        elasticsearch-rest-high-level-client  
      
  1. 配置Elasticsearch连接:在application.properties或application.yml文件中配置Elasticsearch的连接信息:
spring:
  data:
    elasticsearch:
      cluster-nodes: localhost:9200
  1. 创建实体类:创建与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;  
    }  
}
  1. 创建ElasticsearchRepository:创建一个继承自ElasticsearchRepository的接口,用于定义Elasticsearch的操作:
public interface ProductRepository extends ElasticsearchRepository {  
    // 根据名称查找产品  
    Iterable findByName(String name);  
}
  1. 编写业务逻辑:在业务逻辑中使用ElasticsearchRepository来操作Elasticsearch的数据:
@Service  
public class ProductService {  
  
    @Autowired  
    private ProductRepository productRepository;  
  
    public Product saveProduct(Product product) {  
        return productRepository.save(product);  
    }  
  
    public List findAllProducts() {  
        return productRepository.findAll();  
    }  
  
    public List findProductByName(String name) {  
        return (List) productRepository.findByName(name);  
    }  
  
    public void deleteProduct(String id) {  
        productRepository.deleteById(id);  
    }  
}
  1. 在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 getAllProducts() {  
        return productService.findAllProducts();  
    }  
  
    @GetMapping("/name/{name}")  
    public List getProductByName(@PathVariable String name) {  
        return productService.findProductByName(name);  
    }  
  
    @DeleteMapping("/{id}")  
    public void deleteProduct(@PathVariable String id) {  
        productService.deleteProduct(id);  
    }  
}

在实际使用中对于更复杂的查询和高级功能,需要利用Elasticsearch的更高级特性,例如分页、排序、聚合等,编写自定义的查询方法或使用Elasticsearch的原生查询DSL。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...