Elasticsearch介绍和使用步骤详解(含详细代码)

发布时间:2024年01月09日

1. Elasticsearch介绍

Elasticsearch(简称ES)是一个开源的、高扩展的分布式全文检索引擎,可以近乎实时地存储、检索数据。它的设计目标是稳定、可靠、快速,并能够轻松地扩展到上百台服务器,处理PB级别的数据。

以下是关于Elasticsearch的详细介绍:

  1. 基于Lucene:Elasticsearch基于Lucene库开发,它使用Lucene作为其核心来实现所有索引和搜索功能。
  2. 实时性:它能够近乎实时地完成数据的存储和检索。
  3. 分布式:为了处理大型数据集并实现容错和高可用性,ES可以运行在许多互相合作的服务器上,这些服务器的集合称为集群。每个服务器在集群中称为节点。
  4. 高可用性:它通过复制机制提供了数据冗余和高可用性,每个索引可以有多个副本来防止数据丢失。
  5. 查询能力:ES支持复杂的全文搜索能力,可以通过简单的RESTful API来隐藏Lucene的复杂性,使得全文检索变得简单。它还支持使用JSON进行数据索引,查询速度快。
  6. 扩展性:由于其分布式和可扩展的特性,它经常被用于构建大型搜索平台、日志分析系统、以及数据集的实时分析系统等。
  7. 应用广泛:它是当前流行的企业级搜索引擎,广泛应用于各种规模的企业和组织中。
  8. 开放性:Elasticsearch是开源的,可以在Apache许可条款下免费使用和修改。
  9. 语言支持:Elasticsearch提供了丰富的客户端API,支持Java、Python、JavaScript、Ruby、C#、Go等语言。
  10. 集成性:它可以与其他工具和平台集成,例如Logstash、Kibana、Beats等,提供了强大的日志分析功能。

总的来说,Elasticsearch是一个强大、灵活且易于使用的分布式全文检索引擎,广泛应用于各种规模的企业和组织中。

2. Elasticsearch使用

  1. 添加依赖

pom.xml中添加以下依赖:

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>  
</dependency>
  1. 配置连接

application.properties中配置Elasticsearch连接信息:

spring.data.elasticsearch.cluster-name=your-cluster-name  
spring.data.elasticsearch.cluster-nodes=your-host:your-port
  1. 定义实体

创建一个实体类,例如Product

import org.springframework.data.annotation.Id;  
import org.springframework.data.elasticsearch.annotations.Document;  
import org.springframework.data.elasticsearch.annotations.Field;  
import org.springframework.data.elasticsearch.annotations.FieldType;  
  
@Document(indexName = "product", type = "product")  
public class Product {  
    @Id  
    private String id;  
    @Field(type = FieldType.Keyword)  
    private String name;  
    @Field(type = FieldType.Keyword)  
    private String description;  
    // getters and setters...  
}
  1. 创建Repository

创建一个继承ElasticsearchRepository的接口:

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;  
import org.springframework.stereotype.Repository;  
  
@Repository  
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
}
  1. 使用Repository

在Service或Controller中使用Repository:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

import static org.springframework.data.elasticsearch.core.query.QueryBuilders.*;

import org.springframework.data.domain.*;
import org.springframework.data.elasticsearch.*;
import org.springframework.data.*;
import org.springframework.*;

import java.*;
import java.util.*;
import java.util.*;

public class ProductService {
    private final ProductRepository productRepository;

    @Autowired
    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    public Page<Product> findAll(Pageable pageable) {
        return productRepository.findAll(pageable);
    }

    public List<Product> findByName(String name) {
        return productRepository.findByName(name);
    }

    public List<Product> findByDescription(String description) {
        return productRepository.findByDescription(description);
    }
    // other methods...
}
  1. 自定义查询

如果你需要执行更复杂的查询,可以在Repository接口中定义自定义方法,并使用Elasticsearch的Query对象来构建查询条件。例如:

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;  
import org.springframework.stereotype.Repository;  
  
@Repository  
public interface ProductRepository extends ElasticsearchRepository<Product, String> {  
    List<Product> findByCustomQuery(String customQuery);
}

在实现该自定义查询方法时,可以使用Elasticsearch的QueryBuilder来构建复杂的查询条件。例如:

public class ProductRepositoryImpl implements ProductRepository {  
    @Override  
    public List<Product> findByCustomQuery(String customQuery) {  
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();  
        // 添加bool查询的must条件,相当于AND查询  
        boolQueryBuilder.must(QueryBuilders.matchQuery("name", customQuery));  
        boolQueryBuilder.must(QueryBuilders.matchQuery("description", customQuery));  
        // 添加bool查询的should条件,相当于OR查询  
        boolQueryBuilder.should(QueryBuilders.termQuery("category", "electronics"));  
        boolQueryBuilder.should(QueryBuilders.termQuery("category", "books"));  
        // 添加bool查询的filter条件,用于过滤不需要的数据,不参与排序和分页等操作,只用于过滤数据。  
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(100).lte(500));  
        // 执行查询  
        return elasticsearchTemplate().search(boolQueryBuilder, Product.class)  
                                       .stream()  
                                       .map(SearchHit::getContent)  
                                       .collect(Collectors.toList());  
    }  
}
文章来源:https://blog.csdn.net/a342874650/article/details/135490511
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。