Elasticsearch入门
什么是Elasticsearch
Elasticsearch是一个基于Lucene搜索引擎的分布式、开源、RESTful搜索和分析引擎。它提供了一个快速、稳定、可靠的搜索解决方案,能够处理大量的结构化或非结构化数据,并支持全文搜索、地理位置搜索、自动完成、聚合分析等功能。
以下是一些Elasticsearch的重要概念和特点:
- 索引(Index):Elasticsearch中的数据存储在索引中,每个索引包含一个或多个文档类型(Type),每个文档类型包含一个或多个文档(Document)。
- 分片和副本(Sharding and Replication):Elasticsearch将索引分成多个分片存储在不同的节点上,以提高搜索和性能。此外,Elasticsearch还支持副本,以提高可用性和容错能力。
- 节点(Node):Elasticsearch集群中的每个服务器称为节点,每个节点都是一个完整的搜索引擎,可以存储和处理数据。
- RESTful API:Elasticsearch使用RESTful API来提供搜索和分析功能,使其易于与其他系统集成。
- 查询DSL(Domain Specific Language):Elasticsearch提供了一个基于JSON的查询DSL,使用户可以使用简单的语法构建高级查询。
- 聚合(Aggregation):Elasticsearch支持各种聚合函数,例如平均值、最大值、最小值、求和等,以及基于时间、地理位置、范围等维度的聚合。
- 实时搜索(Real-time search):Elasticsearch支持实时搜索,即索引中的新数据可以立即被搜索到。
- 开放性(Openness):Elasticsearch是一个开源、可扩展、可定制的搜索引擎,可以与各种数据源和系统集成。
Elasticsearch的相关语法
索引操作语法
创建索引:
PUT http:127.0.0.1:9200/index_name
删除索引:
DELETE http:127.0.0.1:9200/index_name
查询所有索引:
GET http:127.0.0.1:9200/_cat/indices
文档操作语法
创建文档:
POST http:127.0.0.1:9200/index_name/_doc
{ "field1": "value1", "field2": "value2", ... }
更新文档:
POST http:127.0.0.1:9200/index_name/_update/document_id
{ "doc": { "field1": "new_value1", "field2": "new_value2", ... } }
删除文档:
DELETE http:127.0.0.1:9200/index_name/_doc/document_id
获取文档:
GET http:127.0.0.1:9200/index_name/_doc/document_id
搜索操作语法
简单搜索:
GET http:127.0.0.1:9200/index_name/_search?q=<query>
使用查询DSL进行搜索:
POST http:127.0.0.1:9200/index_name/_search
{ "query": { <query DSL> } }
聚合搜索:
POST http:127.0.0.1:9200/index_name/_search
{ "aggs": { <aggregation DSL> }, "query": { <query DSL> } }
查询DSL语法
匹配查询:
{ "match": { "field": "value" } }
多字段匹配查询:
{ "multi_match": { "query": "value", "fields": ["field1", "field2"] } }
范围查询:
{ "range": { "field": { "gte": 10, "lte": 20 } } }
过滤查询:
{ "bool": { "filter": { "term": { "field": "value" } } } }
聚合查询:
{ "aggs": { "agg_name": { "<aggregation_type>": { "field": "field_name" } } } }
查询字符串查询(Query String Query):这是一种简单的语法,允许用户在搜索框中输入查询字符串,Elasticsearch将解析该字符串并返回匹配的结果。例如:
GET http:127.0.0.1:9200/my_index/_search?q=user:john // 这将返回所有包含"user"字段中包含"john"的文档。
基于JSON的查询DSL(Query DSL):这是一种更高级的语法,允许用户构建更复杂的查询。例如:
GET http:127.0.0.1:9200/my_index/_search // 这将返回所有包含"user"字段匹配"john"的文档。
{ "query": { "match": { "user": "john" } } }
过滤器(Filter):过滤器可以用于限制搜索结果,例如基于时间、地理位置、数据范围等限制。例如:
GET http:127.0.0.1:9200/my_index/_search // 这将返回所有"user"字段匹配"john"并且"age"字段大于等于18的文档。
{ "query": { "bool": { "must": { "match": { "user": "john" } }, "filter": { "range": { "age": { "gte": 18 } } } } } }
聚合(Aggregations):聚合函数可以用于计算结果的统计信息,例如平均值、最大值、最小值、求和等。例如:
GET http:127.0.0.1:9200/my_index/_search // 这将返回所有文档中"age"字段的平均值。
{ "aggs": { "avg_age": { "avg": { "field": "age" } } } }
Elasticsearch的优缺点?
Elasticsearch作为一种分布式、开源、文本搜索和分析引擎,具有以下优点和缺点:
优点:
- 高性能:Elasticsearch具有快速的搜索和分析能力,能够处理大量的结构化和非结构化数据,并支持实时搜索和聚合分析。
- 可扩展性:Elasticsearch是基于分布式架构设计的,可以在多个节点上存储和处理数据,能够轻松应对数据量的增长和高并发查询请求。
- 易用性:Elasticsearch提供了简单易用的RESTful API和基于JSON的查询DSL,使用户可以轻松构建高级查询和聚合分析。
- 开放性:Elasticsearch是一个开源、可定制和可扩展的搜索引擎,可以与各种数据源和系统集成。
- 多样化的用途:Elasticsearch不仅可以作为搜索引擎使用,还可以用于日志分析、安全分析、业务分析等各种用途。
缺点:
- 复杂性:Elasticsearch作为一种分布式系统,具有复杂的架构和配置,需要一定的学习和实践经验才能使用和管理。
- 学习曲线:Elasticsearch具有一定的学习曲线,需要用户掌握查询语法、索引设计、分片和副本、性能调优等方面的知识。
- 硬件要求:Elasticsearch需要运行在一组高性能的服务器上,需要足够的存储空间、内存和带宽。
- 数据安全:由于Elasticsearch是开源的,因此需要用户自行负责数据的安全和防护,例如访问控制、加密和日志审计等方面。
Elasticsearch的使用场景
Elasticsearch是一种文本搜索和分析引擎,适用于以下场景:
- 搜索引擎:Elasticsearch可以用于构建全文搜索引擎,包括网页搜索、电商搜索、社交媒体搜索等各种用途。
- 日志分析:Elasticsearch可以用于实时分析大量的日志数据,包括应用程序日志、服务器日志、安全日志等。
- 业务分析:Elasticsearch可以用于分析业务数据,如销售数据、用户数据、产品数据等,进行聚合分析、可视化和报表生成等。
- 安全分析:Elasticsearch可以用于实时监测和分析网络攻击、恶意软件、数据泄露等安全事件,提供实时警报和响应。
- 全文检索:Elasticsearch可以用于构建文档检索系统、知识库搜索、法律文献检索等各种用途。
- 语音搜索:Elasticsearch可以用于构建语音搜索引擎,包括智能音箱、语音助手、语音识别等各种用途。
Elasticsearch如何整合Springboot?
整合Spring Boot和Elasticsearch可以实现在Spring Boot应用程序中使用Elasticsearch进行搜索和分析。以下是整合Spring Boot和Elasticsearch的步骤:
添加Elasticsearch依赖:在Spring Boot项目的pom.xml文件中添加Elasticsearch客户端的依赖,例如:
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.10.2</version> </dependency>
配置Elasticsearch客户端:在Spring Boot应用程序中配置Elasticsearch客户端,可以使用RestHighLevelClient类进行配置,例如:
@Bean(destroyMethod = "close") public RestHighLevelClient client() { final ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo("localhost:9200") .build(); return RestClients.create(clientConfiguration).rest(); }
定义实体类:定义需要存储到Elasticsearch中的实体类,例如:
@Data @NoArgsConstructor @AllArgsConstructor @Builder public class Book { private String id; private String title; private String author; private String content; private LocalDateTime createTime; }
定义Elasticsearch仓库:定义Elasticsearch仓库接口,继承ElasticsearchRepository接口,例如:
@Repository public interface BookRepository extends ElasticsearchRepository<Book, String> { }
实现业务逻辑:在Service层实现业务逻辑,例如:
@Service public class BookServiceImpl implements BookService { @Autowired private BookRepository bookRepository; @Override public void save(Book book) { bookRepository.save(book); } @Override public void deleteById(String id) { bookRepository.deleteById(id); } @Override public Book findById(String id) { return bookRepository.findById(id).orElse(null); } @Override public List<Book> findByTitle(String title) { return bookRepository.findByTitle(title); } @Override public List<Book> findByAuthor(String author) { return bookRepository.findByAuthor(author); } @Override public List<Book> search(String keyword) { QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(keyword, "title", "author", "content"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(queryBuilder); Iterable<Book> searchResult = bookRepository.search(sourceBuilder); List<Book> resultList = new ArrayList<>(); searchResult.forEach(resultList::add); return resultList; } }
使用Elasticsearch:在Controller层接收请求,调用Service层实现业务逻辑,例如:
@RestController @RequestMapping("/book") public class BookController { @Autowired private BookService bookService; @PostMapping public void save(@RequestBody Book book) { bookService.save(book); } @DeleteMapping("/{id}") public void deleteById(@PathVariable String id) { bookService.deleteById(id); } @GetMapping("/{id}") public Book findById(@PathVariable String id) { return bookService.findById(id); } @GetMapping public List<Book> search(@RequestParam String keyword) { return bookService.search(keyword); } }
Linux如何安装Elasticsearch
Linux安装Elasticsearch可以分为以下步骤:
安装Java:Elasticsearch需要Java运行环境,因此需要先安装Java。可以使用以下命令安装Java:
apt-get update apt-get install openjdk-11-jre-headless
下载Elasticsearch:可以从Elasticsearch的官方网站下载Elasticsearch的压缩包,例如:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.12.0-linux-x86_64.tar.gz
解压Elasticsearch:使用以下命令解压Elasticsearch:
tar -xzf elasticsearch-7.12.0-linux-x86_64.tar.gz
配置Elasticsearch:在解压后的Elasticsearch目录中,打开config目录,修改elasticsearch.yml文件,可以设置集群名称、节点名称、监听地址等配置,例如:
cluster.name: my-cluster node.name: my-node network.host: 0.0.0.0
启动Elasticsearch:使用以下命令启动Elasticsearch:
cd elasticsearch-7.12.0/bin/ ./elasticsearch
验证Elasticsearch:可以使用curl命令验证Elasticsearch是否正常运行,例如:
curl http://localhost:9200/
如果Elasticsearch正常运行,会返回类似以下的响应:
{ "name" : "my-node", "cluster_name" : "my-cluster", "cluster_uuid" : "7p4wv4J4T4CQ2JhV7M0JvQ", "version" : { "number" : "7.12.0", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "78722783c38caa25a70982b5b042074cde5d3b3a", "build_date" : "2021-03-18T06:17:15.410153305Z", "build_snapshot" : false, "lucene_version" : "8.8.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }