单机es

本文详细介绍了Elasticsearch的9200和9300端口的功能差异,9200用于HTTP通信,9300用于TCP集群内部通信。接着,通过Java代码展示了如何创建HTTP连接,创建索引,设置索引的settings和mappings,创建实体类,以及添加单条和批量数据的操作。同时,还提供了检查索引是否存在的方法。

1:es的9300端口和9200端口的区别
9200作为http协议,主要用于外部通讯
9300作为tcp协议,jar之间通过tcp协议,es集群是通过9300通讯
2:创建http连接
pom

<!-- elasticsearch的客户端 -->
    <dependency>
      <groupId>org.elasticsearch.client</groupId>
      <artifactId>elasticsearch-rest-high-level-client</artifactId>
      <version>6.5.4</version>
    </dependency>
    <dependency>
      <groupId>org.elasticsearch</groupId>
      <artifactId>elasticsearch</artifactId>
      <version>6.5.4</version>
    </dependency>

代码

//        创建HttpHost对象
    HttpHost httpHost = new HttpHost("127.0.0.1",9200);
//      创建RestClientBuilder
    RestClientBuilder builder = RestClient.builder(httpHost);
    //      创建RestHighLevelClien对象
    RestHighLevelClient client = new RestHighLevelClient(builder);

3:创建index

//1、 准备关于索引的settings
    Settings.Builder settings = Settings.builder()
        .put("number_of_shards", 3)
        .put("number_of_replicas", 1);


    //2、 准备关于索引的结构mappings
    XContentBuilder mappings = JsonXContent.contentBuilder()
        .startObject()
        .startObject("properties")
        .startObject("name")
        .field("type","text")
        .endObject()
        .startObject("age")
        .field("type","integer")
        .endObject()
        .startObject("birthday")
        .field("type","date")
        .field("format","yyyy-MM-dd")
        .endObject()
        .endObject()
        .endObject();

    //2 将settings 和 mappings封装成一个request对象
    CreateIndexRequest request = new CreateIndexRequest("biaoming")
        .settings(settings)
        .mapping("leixing",mappings);
    //3   通过client对象去链接es并执行创建索引
    RestHighLevelClient client = getClient();
    CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);

    //测试
    System.out.println("response"+response.toString());

4:创建实体类

@Data
/**无参构造*/
@NoArgsConstructor
/**有参构造*/
@AllArgsConstructor
public class Persion {
  @JsonIgnore
  private Integer id;

  private String name;

  private Integer age;

  private Date birthDay;
}

5:添加一条数据

//准备json数据
    Persion persion = new Persion(555,"张三555",5555,new Date());
    String json = JSON.toJSONString(persion);
      /**
     * 创建request对象
     * 参数说明:
     *      1、索引名,类似MySql中数据库
     *      2、类型名,类似要操作数据库中那一张表
     *      3、手动指定文档id,不指定id则es自动赋值
     */
    //创建request对象
    // 索引名 类型名
    IndexRequest request = new IndexRequest("biaoming","leixing","11");
    request.source(json, XContentType.JSON);
    //获取连接
    RestHighLevelClient client = getClient();
    IndexResponse index = client.index(request, RequestOptions.DEFAULT);

6:批量添加

//准备json数据
    Persion persion = new Persion(555,"张三555",5555,new Date());
    String json = JSON.toJSONString(persion);
    /**
     * 创建request对象
     * 参数说明:
     *      1、索引名,类似MySql中数据库
     *      2、类型名,类似要操作数据库中那一张表
     *      3、手动指定文档id
     */
    //创建request对象
    // 索引名 类型名
    IndexRequest request = new IndexRequest("biaoming","leixing","11");
    request.source(json, XContentType.JSON);
    IndexRequest request1 = new IndexRequest("biaoming","leixing","12");
    request1.source(json, XContentType.JSON);
    IndexRequest request2 = new IndexRequest("biaoming","leixing","13");
    request2.source(json, XContentType.JSON);
    RestHighLevelClient client = getClient();

    //批量插入
    BulkRequest requestAll = new BulkRequest();
    requestAll.add(request);
    requestAll.add(request1);
    requestAll.add(request2);
    BulkResponse bulk = client.bulk(requestAll);

7:检查索引是否存在

//1 准备request对象
    GetIndexRequest request = new GetIndexRequest();
    request.indices("biaoming");
    // 2 通过client去检查
    RestHighLevelClient client =getClient();
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
    System.out.println(exists);
<think>好的,用户现在想了解如何使用Docker部署单机版的Elasticsearch。首先,我需要回顾之前的对话历史。用户之前询问了Windows下的Docker操作命令,现在的问题是关于部署ES,可能是在同一环境下的后续操作。用户可能是开发者或者系统管理员,想要在本地或测试环境中快速搭建ES实例。 首先,用户的需求是单机部署,所以不需要考虑集群配置。但需要确保ES的配置适合单机运行,比如禁用某些集群功能。Docker部署ES的常见问题包括内存不足、目录权限、跨平台路径问题,特别是用户之前问的是Windows下的Docker,可能需要特别处理WindowsLinux容器之间的路径差异。 接下来,我需要整理部署步骤。通常步骤包括拉取镜像、运行容器、配置参数。需要注意ES的版本选择,用户可能没有指定版本,所以应该推荐最新稳定版或者常见版本,比如8.x。此外,ES默认需要较多的内存,需要设置JVM参数,否则可能启动失败。在Docker命令中,可能需要使用环境变量来调整内存设置。 另外,单机模式下,ES 8.x可能会启用安全功能,如密码认证,需要提醒用户注意安全配置,或者如何禁用安全设置(虽然不推荐,但方便测试)。同时,数据持久化是重要的,要确保挂载卷正确配置,防止容器删除后数据丢失。在Windows下,路径可能需要特别处理,比如使用绝对路径或者转换到Linux风格的路径,尤其是在使用WSL2时。 还需要考虑端口映射,ES默认使用92009300端口,确保宿主机的端口没有被占用。可能还需要配置discovery.type为single-node,以单节点模式运行,避免启动时的集群检查。 用户可能的疑问点包括:如何验证ES是否运行成功,如何访问,如何处理常见错误(如内存不足、无法绑定端口)。需要给出简单的验证方法,比如curl命令或者浏览器访问。同时,数据存储路径在Windows下的具体位置可能需要示例说明。 另外,安全方面,ES 8.x默认启用安全,首次运行会生成默认密码,需要提示用户如何获取或重置密码。或者,如果用户希望快速测试,可以指导如何关闭安全设置,但需说明风险。 最后,给出一个docker-compose.yml的示例可能对用户更方便,特别是如果他们需要更复杂的配置或者计划未来扩展。docker-compose可以简化命令,减少出错的可能。 总结需要注意的几点:版本选择、内存配置、数据持久化、单节点模式设置、安全配置、跨平台路径处理,以及验证步骤。需要将这些点组织成清晰的步骤,并给出相应的命令示例解释。同时,提醒用户注意Windows下的特定问题,如文件路径权限,建议使用WSL2以提高性能。</think>以下是使用 Docker 部署单机Elasticsearch (ES) 的详细步骤及注意事项,适用于 **Windows/Linux/macOS** 环境: --- ### **一、快速部署命令** ```bash # 拉取最新版 Elasticsearch 镜像(推荐指定版本,如 elasticsearch:8.12.2) docker pull elasticsearch:8.12.2 # 运行单机Elasticsearch 容器 docker run -d \ --name my-es \ -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ # 单节点模式 -e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \ # 限制 JVM 内存(根据机器配置调整) -v es_data:/usr/share/elasticsearch/data \ # 持久化数据卷 elasticsearch:8.12.2 ``` --- ### **二、关键配置说明** 1. **版本选择** - 推荐使用 **7.x 或 8.x** 版本(如 `elasticsearch:8.12.2`)。 - 旧版命令可能不兼容,例如 ES 7.x 默认禁用安全认证,而 8.x 强制启用。 2. **单节点模式** - 必须设置环境变量 `discovery.type=single-node`,否则 ES 会等待集群其他节点加入,导致启动失败。 3. **内存限制** - 通过 `ES_JAVA_OPTS` 限制 JVM 内存(如 `-Xms1g -Xmx1g`),避免容器占用过多资源。 4. **数据持久化** - 使用 `-v es_data:/usr/share/elasticsearch/data` 将数据保存到 Docker 卷(`es_data`),避免容器删除后数据丢失。 --- ### **三、访问与验证** 1. **检查容器状态** ```bash docker logs my-es # 查看启动日志 docker exec -it my-es curl http://localhost:9200 # 容器内访问 ``` 2. **宿主机访问** 浏览器或命令行访问: ```bash curl http://localhost:9200 ``` 成功响应示例: ```json { "name": "node-1", "cluster_name": "docker-cluster", "version": { ... }, "tagline": "You Know, for Search" } ``` --- ### **四、安全配置(ES 8.x 必须)** ES 8.x 默认启用安全认证,首次启动时会输出默认密码。若需关闭认证(仅测试环境): ```bash docker run -d \ --name my-es \ -p 9200:9200 \ -e "discovery.type=single-node" \ -e "xpack.security.enabled=false" \ # 关闭安全认证 elasticsearch:8.12.2 ``` --- ### **五、挂载自定义配置文件** 1. **准备配置文件** 创建 `elasticsearch.yml`(例如关闭安全认证): ```yaml cluster.name: "my-es-cluster" xpack.security.enabled: false ``` 2. **运行容器并挂载配置** ```bash docker run -d \ --name my-es \ -p 9200:9200 \ -v C:\config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ # Windows 路径 elasticsearch:8.12.2 ``` --- ### **六、使用 Docker Compose 部署** 1. **创建 `docker-compose.yml`** ```yaml version: '3' services: elasticsearch: image: elasticsearch:8.12.2 container_name: my-es environment: - discovery.type=single-node - ES_JAVA_OPTS=-Xms2g -Xmx2g ports: - "9200:9200" - "9300:9300" volumes: - es_data:/usr/share/elasticsearch/data volumes: es_data: ``` 2. **启动服务** ```bash docker-compose up -d ``` --- ### **七、常见问题解决** | 问题 | 解决方案 | |------|----------| | **启动失败:内存不足** | 增加 `ES_JAVA_OPTS` 内存值(如 `-Xms2g -Xmx2g`) | | **无法访问 9200 端口** | 检查防火墙或杀毒软件是否阻止端口 | | **数据权限错误**(Linux 主机) | 添加 `-e "TAKE_FILE_OWNERSHIP=true"` 自动修复权限 | | **ES 8.x 首次启动无密码** | 查看容器日志:`docker logs my-es` 中查找 `Password for the elastic user` | --- ### **八、扩展场景** - **集成 Kibana**:添加 Kibana 服务到 `docker-compose.yml`,配置 `ELASTICSEARCH_HOSTS=http://elasticsearch:9200`。 - **性能调优**:调整 `vm.max_map_count`(Linux 主机需执行 `sysctl -w vm.max_map_count=262144`)。 --- 通过 Docker 部署单机 ES 可快速搭建开发/测试环境,生产环境建议使用集群部署并启用完整安全配置。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值