Elasticsearch介绍和使用步骤详解(含详细代码)
2024-01-09 22:36:20
1. Elasticsearch介绍
Elasticsearch(简称ES)是一个开源的、高扩展的分布式全文检索引擎,可以近乎实时地存储、检索数据。它的设计目标是稳定、可靠、快速,并能够轻松地扩展到上百台服务器,处理PB级别的数据。
以下是关于Elasticsearch的详细介绍:
- 基于Lucene:Elasticsearch基于Lucene库开发,它使用Lucene作为其核心来实现所有索引和搜索功能。
- 实时性:它能够近乎实时地完成数据的存储和检索。
- 分布式:为了处理大型数据集并实现容错和高可用性,ES可以运行在许多互相合作的服务器上,这些服务器的集合称为集群。每个服务器在集群中称为节点。
- 高可用性:它通过复制机制提供了数据冗余和高可用性,每个索引可以有多个副本来防止数据丢失。
- 查询能力:ES支持复杂的全文搜索能力,可以通过简单的RESTful API来隐藏Lucene的复杂性,使得全文检索变得简单。它还支持使用JSON进行数据索引,查询速度快。
- 扩展性:由于其分布式和可扩展的特性,它经常被用于构建大型搜索平台、日志分析系统、以及数据集的实时分析系统等。
- 应用广泛:它是当前流行的企业级搜索引擎,广泛应用于各种规模的企业和组织中。
- 开放性:Elasticsearch是开源的,可以在Apache许可条款下免费使用和修改。
- 语言支持:Elasticsearch提供了丰富的客户端API,支持Java、Python、JavaScript、Ruby、C#、Go等语言。
- 集成性:它可以与其他工具和平台集成,例如Logstash、Kibana、Beats等,提供了强大的日志分析功能。
总的来说,Elasticsearch是一个强大、灵活且易于使用的分布式全文检索引擎,广泛应用于各种规模的企业和组织中。
2. Elasticsearch使用
- 添加依赖
在pom.xml
中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
- 配置连接
在application.properties
中配置Elasticsearch连接信息:
spring.data.elasticsearch.cluster-name=your-cluster-name
spring.data.elasticsearch.cluster-nodes=your-host:your-port
- 定义实体
创建一个实体类,例如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...
}
- 创建Repository
创建一个继承ElasticsearchRepository
的接口:
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
}
- 使用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...
}
- 自定义查询
如果你需要执行更复杂的查询,可以在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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!