一文读懂Elasticsearch

291 阅读5分钟

3829e461904444a1820c0445b2d5888a_tplv-obj.jpg

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。