Elasticsearch 是一个基于 Apache Lucene 的搜索引擎,可帮助您快速、可靠地存储和搜索大量数据。它是一个分布式、实时的搜索和分析引擎,具有强大的全文搜索、结构化搜索、分析和可视化功能。
本教程将介绍 Elasticsearch 的基本概念、如何安装和配置 Elasticsearch、如何索引和搜索数据,以及如何使用一些高级功能,如聚合、地理位置搜索和复杂查询等。
基本概念
在开始学习 Elasticsearch 之前,需要了解一些基本概念:
- 节点(Node):节点是 Elasticsearch 集群中的一个单独的实例,负责存储和处理数据。一个节点可以是主节点或数据节点,也可以同时兼具两者角色。
- 集群(Cluster):集群是由一个或多个节点组成的,用于存储和处理数据。所有节点都知道集群中的所有其他节点,每个节点都可以与集群中的任何其他节点通信。
- 索引(Index):索引是一种数据存储方式,类似于数据库中的表。每个索引都包含了一个或多个文档,每个文档包含了一组字段,表示一个数据实体。每个字段都包含了一个名称和一个值,可以是文本、数字、日期等类型。
- 类型(Type):类型是索引中文档的逻辑分组,用于对文档进行分类。在 Elasticsearch 7.x 中,类型已经被废弃,文档现在只属于索引,不再属于任何类型。
- 文档(Document):文档是索引中的一条记录,由一个或多个字段组成。每个文档都有一个唯一的 ID,用于区分不同的文档。
- 分片(Shard):为了支持大量的数据存储和高并发查询,Elasticsearch 将索引划分为多个分片。每个分片都是一个独立的 Lucene 索引,可以存储和处理部分数据。多个分片可以在不同的节点上存储和处理,从而实现分布式存储和查询。
安装和配置
Elasticsearch 可以在 Linux、Windows 和 Mac OS X 等操作系统上运行,可以从官方网站
www.elastic.co/cn/download… 下载最新版本的 Elasticsearch。
安装 Elasticsearch 的方法有很多种,这里介绍一种比较简单的方法,即通过解压缩 tar 包来安装。下面是安装步骤:
- 下载 Elasticsearch 的 tar 包,解压缩到指定目录:
shellCopy code$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.14.1-linux-x86_64.tar.gz
- 解压缩 tar 包:
shellCopy code$ tar -zxvf elasticsearch-7.14.1-linux-x86_64.tar.gz
- 进入 Elasticsearch 目录:
shellCopy code$ cd elasticsearch-7.14.1
- 启动 Elasticsearch:
shellCopy code$ ./bin/elasticsearch
默认情况下,Elasticsearch 启动时会监听本地 9200 端口,可以通过浏览器访问 http://localhost:9200 验证是否启动成功。
为了保证 Elasticsearch 的性能和稳定性,需要对其进行一些配置。在 Elasticsearch 的配置文件中,有许多可以配置的参数,例如集群名称、节点名称、分片数、副本数等。可以在 config/elasticsearch.yml 文件中设置这些参数。
索引和搜索数据
在 Elasticsearch 中,可以通过 RESTful API 创建、更新、删除索引,以及索引和搜索数据。下面是一些常用的 API:
- PUT /{index}:创建一个索引。
- GET /{index}:获取一个索引的信息。
- DELETE /{index}:删除一个索引。
- PUT /{index}/_doc/{id}:创建一个文档。
- GET /{index}/_doc/{id}:获取一个文档。
- DELETE /{index}/_doc/{id}:删除一个文档。
- POST /{index}/_search:搜索一个索引。
下面是一个简单的示例,演示如何创建一个索引、添加一个文档、搜索文档,并对搜索结果进行聚合操作:
javaCopy codeRestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http")));
// 创建一个索引
CreateIndexRequest request = new CreateIndexRequest("my-index");
client.indices().create(request, RequestOptions.DEFAULT);
// 添加一个文档
IndexRequest indexRequest = new IndexRequest("my-index")
.id("1")
.source(XContentType.JSON, "field", "value");
client.index(indexRequest, RequestOptions.DEFAULT);
// 搜索文档
SearchRequest searchRequest = new SearchRequest("my-index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("field", "value"));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 聚合操作
AggregationBuilder aggregation =
AggregationBuilders
.terms("by_field")
.field("field");
searchSourceBuilder.aggregation(aggregation);
searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
高级功能
除了基本的索引和搜索功能之外,Elasticsearch 还提供了许多高级功能,如聚合、地理位置搜索和复杂查询等。
聚合
聚合是 Elasticsearch 中最强大的功能之一,可以对搜索结果进行分组、统计、排序、过滤等操作。下面是一个简单的聚合示例,演示如何按照某个字段进行分组,并统计每个分组中文档的数量:
地理位置搜索
Elasticsearch 中支持地理位置搜索,可以搜索某个范围内的文档。下面是一个简单的示例,演示如何搜索距离某个坐标一定范围内的文档:
javaCopy code// 创建一个索引,包含地理位置信息
CreateIndexRequest request = new CreateIndexRequest("my-index");
request.mapping("{"properties":{"location":{"type":"geo_point"}}}", XContentType.JSON);
client.indices().create(request, RequestOptions.DEFAULT);
// 添加文档,包含地理位置信息
IndexRequest indexRequest = new IndexRequest("my-index")
.id("1")
.source(XContentType.JSON, "location", "39.9,-75.2");
client.index(indexRequest, RequestOptions.DEFAULT);
// 搜索距离某个坐标 10km 范围内的文档
SearchRequest searchRequest = new SearchRequest("my-index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders
.geoDistanceQuery("location")
.point(40.0, -75.0)
.distance(10, DistanceUnit.KILOMETERS));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
复杂查询
Elasticsearch 中支持各种复杂的查询操作,如布尔查询、范围查询、前缀查询、通配符查询、正则表达式查询等。下面是一个简单的示例,演示如何进行布尔查询和范围查询:
javaCopy code// 创建一个索引,包含数值类型的字段
CreateIndexRequest request = new CreateIndexRequest("my-index");
request.mapping("{"properties":{"num":{"type":"integer"}}}", XContentType.JSON);
client.indices().create(request, RequestOptions.DEFAULT);
// 添加文档,包含数值类型的字段
IndexRequest indexRequest = new IndexRequest("my-index")
.id("1")
.source(XContentType.JSON, "num", 10);
client.index(indexRequest, RequestOptions.DEFAULT);
// 布尔查询:num>5 AND num<15
SearchRequest searchRequest = new SearchRequest("my-index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders
.boolQuery()
.must(QueryBuilders.rangeQuery("num").gt(5))
.must(QueryBuilders.rangeQuery("num").lt(15)));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 范围查询:num>5 AND num<15
searchRequest = new SearchRequest("my-index");
searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.rangeQuery("num").from(5).to(15));
searchRequest.source(searchSourceBuilder);
searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
总结
本文介绍了 Elasticsearch 的基本概念、安装和配置方法,以及如何使用 Java API 对 Elasticsearch 进行索引和搜索操作。同时,还介绍了 Elasticsearch 的高级功能,包括聚合、地理位置搜索和复杂查询。希望本文能够帮助读者快速上手 Elasticsearch。