Elasticsearch 使用文档

简介

Elasticsearch 是一个开源的分布式搜索引擎,它可以快速地存储、搜索和分析大量数据。它使用 Lucene 作为底层搜索引擎,提供了 RESTful API 接口,支持多种数据格式和查询语言。

本文档将介绍 Elasticsearch 的基本概念、安装和配置、数据索引和查询、集群管理等方面的内容。

基本概念

索引

Elasticsearch 中的索引类似于关系型数据库中的表,它是一个包含多个文档的逻辑容器。每个索引都有一个唯一的名称,可以包含多个类型。

类型

类型是索引中的一个逻辑分组,它定义了文档的结构和字段。每个类型都有一个唯一的名称,可以包含多个文档。

文档

文档是 Elasticsearch 中的基本单位,它是一个 JSON 格式的数据对象。每个文档都有一个唯一的 ID,它属于一个类型,并存储在一个索引中。

分片

为了支持大规模数据存储和查询,Elasticsearch 将索引分成多个分片,每个分片可以存储一部分数据。分片可以分布在不同的节点上,从而实现分布式存储和查询。

副本

为了提高数据的可用性和容错性,Elasticsearch 支持将分片复制到多个节点上,这些复制分片称为副本。副本可以提高查询的并发性和响应速度,同时也可以在节点故障时提供数据的备份和恢复。

安装和配置

安装 Elasticsearch

Elasticsearch 可以在 Windows、Linux、Mac OS X 等操作系统上运行,它的安装非常简单,只需要下载对应版本的压缩包,解压后即可使用。

下载地址:https://www.elastic.co/downloads/elasticsearch

配置 Elasticsearch

Elasticsearch 的配置文件位于 config/elasticsearch.yml,可以通过修改该文件来配置 Elasticsearch 的参数。

以下是一些常用的配置参数:

  • cluster.name:集群名称,默认为 elasticsearch
  • node.name:节点名称,默认为随机生成的名称。
  • network.host:节点绑定的 IP 地址,默认为 localhost
  • http.port:HTTP 服务监听的端口号,默认为 9200
  • discovery.zen.ping.unicast.hosts:集群中其他节点的 IP 地址列表。

数据索引和查询

索引数据

要索引数据,首先需要创建一个索引,然后定义一个类型,最后将文档添加到该类型中。

以下是一个示例:

# 创建索引
PUT /my_index

# 定义类型
PUT /my_index/my_type/_mapping
{
  "properties": {
    "title": {
      "type": "text"
    },
    "content": {
      "type": "text"
    },
    "timestamp": {
      "type": "date"
    }
  }
}

# 添加文档
PUT /my_index/my_type/1
{
  "title": "Hello World",
  "content": "This is my first Elasticsearch document",
  "timestamp": "2022-01-01T00:00:00"
}

查询数据

要查询数据,可以使用 Elasticsearch 提供的 RESTful API 接口,支持多种查询语言和查询方式。

以下是一些常用的查询语句:

  • GET /my_index/my_type/_search:查询所有文档。
  • GET /my_index/my_type/_search?q=title:hello:查询标题包含 “hello” 的文档。
  • GET /my_index/my_type/_search?q=content:elasticsearch:查询内容包含 “elasticsearch” 的文档。
  • GET /my_index/my_type/_search?q=timestamp:>2022-01-01:查询时间戳大于 “2022-01-01” 的文档。
  • GET /my_index/my_type/_search?q=title:hello AND content:elasticsearch:查询标题包含 “hello” 并且内容包含 “elasticsearch” 的文档。

集群管理

集群健康状态

要查看集群的健康状态,可以使用以下命令:

GET /_cluster/health

该命令将返回一个 JSON 格式的响应,包含集群的健康状态、节点数量、分片数量等信息。

节点信息

要查看节点的信息,可以使用以下命令:

GET /_cat/nodes?v

该命令将返回一个表格格式的响应,包含节点的名称、IP 地址、状态等信息。

分片信息

要查看分片的信息,可以使用以下命令:

GET /_cat/shards?v

该命令将返回一个表格格式的响应,包含分片的索引名称、分片编号、状态等信息。

节点加入和退出

要将节点加入集群,可以在节点的配置文件中设置 discovery.zen.ping.unicast.hosts

要将一个新节点加入到Elasticsearch集群中,需要做以下步骤:

  • 在新节点上安装Elasticsearch软件。
  • 配置新节点的elasticsearch.yml文件,指定集群名称和节点名称。
  • 启动新节点的Elasticsearch服务。

新节点启动后,它会自动加入到集群中,并开始接收和处理请求。

节点退出集群:

要将一个节点从Elasticsearch集群中移除,需要做以下步骤:

  • 停止节点上的Elasticsearch服务。
  • 在集群中的其他节点上运行_cluster/nodes/stats API,以查看节点的状态和信息。
  • 在集群中的其他节点上运行_cluster/nodes/_shutdown API,以关闭要移除的节点。

节点关闭后,它会自动从集群中移除,并停止处理请求。

需要注意的是,节点的加入和退出可能会对集群的性能和可用性产生影响,因此应该在非高峰期进行操作,并确保在操作前备份数据。

Elasticsearch 提供的 RESTful API 接口 Java 的使用方法和案例

Elasticsearch 是一个开源的分布式搜索引擎,提供了 RESTful API 接口,可用于实现搜索、聚合、索引等功能。在 Java 中,我们可以使用 Elasticsearch 的 Java API 或者直接调用 RESTful API 接口来操作 Elasticsearch。

本文将介绍 Elasticsearch RESTful API 接口的使用方法和一个简单的案例。

使用 Elasticsearch RESTful API 接口
Elasticsearch 的 RESTful API 接口可以通过 HTTP 请求来访问,常用的请求方法包括 GET、POST、PUT、DELETE 等。下面是一个使用 Elasticsearch RESTful API 接口的简单示例:

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.util.EntityUtils;
import java.io.IOException;

public class ElasticsearchRestClient {
    private static CloseableHttpClient httpClient =
            HttpClients.createDefault();
    private static final String INDEX_NAME = "test_index";
    private static final String BASE_URL = "http://localhost:9200/" + INDEX_NAME + "/_doc/";

    public static void main(String[] args) {
        try {
            // 创建文档
            createDocument();

            // 获取文档
            getDocument();

            // 更新文档
            updateDocument();

            // 删除文档
            deleteDocument();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void createDocument() throws IOException {
        String json = "{ \"name\" : \"John\", \"age\" : 30 }";
        HttpPost httpPost = new HttpPost(BASE_URL + "1");
        httpPost.setEntity(new StringEntity(json, ContentType.APPLICATION_JSON));
        CloseableHttpResponse response = httpClient.execute(httpPost);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity);
        System.out.println("Create document result: " + result);
        response.close();
    }

    public static void getDocument() throws IOException {
        HttpGet httpGet = new HttpGet(BASE_URL + "1");
        CloseableHttpResponse response = httpClient.execute(httpGet);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity);
        System.out.println("Get document result: " + result);
        response.close();
    }

    public static void updateDocument() throws IOException {
        String json = "{ \"name\" : \"John Doe\", \"age\" : 35 }";
        HttpPut httpPut = new HttpPut(BASE_URL + "1");
        httpPut.setEntity(new StringEntity(json, ContentType.APPLICATION_JSON));
        CloseableHttpResponse response = httpClient.execute(httpPut);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity);
        System.out.println("Update document result: " + result);
        response.close();
    }

    public static void deleteDocument() throws IOException {
        HttpDelete httpDelete = new HttpDelete(BASE_URL + "1");
        CloseableHttpResponse response = httpClient.execute(httpDelete);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity);
        System.out.println("Delete document result: " + result);
        response.close();
    }
}

在上面的示例中,我们使用了 Apache HttpComponents 来发送 HTTP 请求。其中,创建文档使用了 POST 请求,获取文档使用了 GET 请求,更新文档使用了 PUT 请求,删除文档使用了 DELETE 请求。

示例:在 Elasticsearch 中搜索文档

下面是一个简单的示例,演示了如何在 Elasticsearch 中搜索文档。

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;

public class ElasticsearchSearchClient {
    private static CloseableHttpClient httpClient =
            HttpClients.createDefault();
    private static final String INDEX_NAME = "test_index";
    private static final String SEARCH_URL = "http://localhost:9200/" + INDEX_NAME + "/_search";

    public static void main(String[] args) {
        try {
            searchDocument();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void searchDocument() throws IOException {
        String json = "{ \"query\": { \"match\": { \"name\": \"John\" } } }";
        HttpGet httpGet = new HttpGet(SEARCH_URL);
        httpGet.setEntity(new StringEntity(json, ContentType.APPLICATION_JSON));
        CloseableHttpResponse response = httpClient.execute(httpGet);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity);
        System.out.println("Search document result: " + result);
        response.close();
    }
}

在上面的示例中,我们使用了 Elasticsearch 的查询语法,通过 match 查询来搜索名字为 John 的文档。

结论

在本文中,我们介绍了 Elasticsearch RESTful API 接口的使用方法和一个简单的案例。使用 Elasticsearch RESTful API 接口,我们可以在 Java 中方便地操作 Elasticsearch,实现搜索、聚合、索引等功能。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐