一、概述

  1. Elasticsearch(ES)9.x:分布式搜索分析引擎,本地部署就是把它装在自己的电脑上,不用依赖云端,核心作用是「存储文本数据+提供API接口」,相当于我们的“数据仓库+操作控制台”。

  2. Open Inference API(开放式推理API):ES9.x 内置的“AI调用接口”,简单说就是 ES 帮我们做好了和 OpenAI、Cohere 等AI服务商的对接,我们不用写复杂代码,只需调用ES的API,就能让AI处理文本(摘要、翻译等)。

  3. OpenAI 对话补全(Chat Completions):OpenAI 的核心功能,能根据我们的指令(比如“总结这段文字”),生成类人文本,ES 集成它后,就能直接对 ES 里的文本数据调用这个功能,不用单独去 OpenAI 官网操作。

核心逻辑:本地部署 ES9.x → 配置 OpenAI 模型(让 ES 能调用 OpenAI)→ 通过 ES API 实现文本处理(摘要/翻译/问答),全程用 Kibana 控制台操作,不用配置复杂IDE。

二、前置准备

2.1 硬件/软件准备(本地部署最低要求)

不用追求高配置,普通电脑就能满足,重点检查以下3点:

  • 硬件:内存 ≥4GB(建议8GB,ES9.x 对内存要求略高,内存不足会启动失败)、CPU ≥2核、可用磁盘 ≥10GB;

  • 操作系统:优先 Linux(Ubuntu 20.04+/CentOS 8+)、macOS 12+;Windows 10/11 需先装 WSL2(避免 ES 启动报错);

  • 必备工具:

    • 浏览器(用于访问 Kibana);

    • 终端/命令行(执行部署和API命令);

    • OpenAI 账号(需获取 API 密钥,后面会讲具体步骤);

    • Docker(可选,用于快速部署数据提取服务,后面会讲)。

2.2 下载所需安装包

重点:ES 和 Kibana 必须是 同版本(均为9.x,比如9.3.0),避免版本不兼容报错。

  1. 下载 ES9.x(本地部署版):

访问官网:https://www.elastic.co/cn/downloads/elasticsearch
选择对应系统(比如 Linux x86_64),下载压缩包(.tar.gz 格式),无需手动安装 JDK(ES9.x 内置 JDK,避免环境冲突)。

  1. 下载 Kibana9.x(配套使用):

访问官网:https://www.elastic.co/cn/downloads/kibana
和 ES 下载相同版本、相同系统的压缩包,Kibana 是 ES 的可视化工具,我们用它的「Dev Tools」控制台执行 API 命令(不用记复杂的命令行语法)。

2.3 获取 OpenAI API 密钥(关键步骤)

ES 调用 OpenAI 功能,必须用 API 密钥授权,步骤如下(全程可直接操作):

  1. 登录 OpenAI 官网:https://platform.openai.com/(没有账号就注册,需要绑定手机号和支付方式,新账号有免费额度);

  2. 登录后,点击右上角「Personal」→「View API Keys」;

  3. 点击「Create new secret key」,输入密钥名称(比如“ES9.x 本地部署”),点击「Create secret key」;

  4. 复制生成的 API 密钥(只显示一次,一定要保存好,后面会用到),格式类似:sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx。

注意:API 密钥是私密信息,不要明文暴露在代码或配置中,后面会讲安全存储方法,避免密钥泄露。

三、实操步骤

步骤1:本地部署 Elasticsearch 9.x(核心步骤)

原理:把 ES 压缩包解压,修改核心配置(适配本地单节点部署),启动 ES 服务,验证是否部署成功。

1.1 解压 ES 压缩包(以 Linux/macOS 为例)

打开终端,进入下载目录(比如 ~/Downloads),执行以下命令(替换文件名为你下载的 ES 版本):

# 解压压缩包(示例版本为9.3.0,根据实际下载的版本修改)
tar -zxvf elasticsearch-9.3.0-linux-x86_64.tar.gz

# 进入 ES 安装目录
cd elasticsearch-9.3.0

1.2 修改 ES 配置文件

原理:ES 默认配置是为集群部署设计的,本地单节点部署需要修改配置,确保能正常启动、允许 Kibana 访问、开启推理 API。

执行命令打开配置文件:

# 用vim打开配置文件(如果没有vim,先执行 sudo apt install vim 安装)
vim config/elasticsearch.yml

按「i」进入编辑模式,添加/修改以下配置(删除原有冲突配置,确保以下内容完整),每一行都有通俗注释:

# 1. 集群名称(本地单节点,随便起,固定即可)
cluster.name: elastic-local

# 2. 节点名称(本地单节点,随便起)
node.name: node-1

# 3. 绑定本地地址(只允许本地电脑访问,安全,避免外部访问)
network.host: 127.0.0.1

# 4. HTTP端口(默认9200,不要修改,后面访问ES用这个端口)
http.port: 9200

# 5. 单节点部署(关键!本地只有一个ES节点,必须设为single-node,否则启动失败)
discovery.type: single-node

# 6. 允许 Kibana 本地连接(Kibana 要访问 ES,必须开启这个配置)
http.cors.enabled: true
http.cors.allow-origin: "http://localhost:5601"

# 7. 开启推理API(ES9.x 默认开启,但保险起见,手动加上,避免功能不可用)
xpack.inference.enabled: true

编辑完成后,按「Esc」,输入「:wq」,回车保存并退出。

1.3 调整 ES 内存(避免内存不足启动失败)

原理:ES 启动时会占用默认内存,若本地内存不足(比如4GB内存),会直接报错,需手动限制内存。

执行命令打开内存配置文件:

vim config/jvm.options

找到以下两行,修改为适合本地内存的值(建议设为物理内存的1/2,比如4GB内存设为2g,8GB内存设为4g):

-Xms2g  # 最小内存(启动时分配的内存)
-Xmx2g  # 最大内存(运行时最大可使用的内存)

保存退出(Esc → :wq)。

1.4 启动 ES 服务(验证部署)

# 进入 ES 安装目录(如果之前退出了)
cd elasticsearch-9.3.0

# 启动 ES(后台启动,避免终端关闭后 ES 停止)
./bin/elasticsearch -d

启动后,验证是否成功:打开浏览器,访问 http://localhost:9200,若出现以下类似内容,说明 ES 部署成功:

{
  "name" : "node-1",
  "cluster_name" : "elastic-local",
  "cluster_uuid" : "xxxxxxxxxxxxxxxxxxxx",
  "version" : {
    "number" : "9.3.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "xxxxxxxxxxxxxxxxxxxx",
    "build_date" : "2024-05-21T15:48:34.330066708Z",
    "build_snapshot" : false,
    "lucene_version" : "9.10.0",
    "minimum_wire_compatibility_version" : "8.11.0",
    "minimum_index_compatibility_version" : "8.0.0"
  },
  "tagline" : "You Know, for Search"
}

常见报错解决:

  • 内存不足:重新调整 jvm.options 里的 -Xms 和 -Xmx,设为更小的值(比如1g);

  • 端口占用:执行 netstat -tuln | grep 9200,找到占用9200端口的进程,执行 kill -9 进程ID 关闭,再重启 ES;

  • 启动无响应:查看 ES 日志,执行 cat logs/elasticsearch.log,根据日志提示排查(比如配置文件写错)。

步骤2:本地部署 Kibana 9.x

原理:Kibana 是 ES 的“可视化操作界面”,我们用它的「Dev Tools」控制台执行 API 命令,比直接用终端更方便,不用记复杂的命令格式,还能实时看到响应结果。

2.1 解压 Kibana 压缩包

# 进入下载目录(和 ES 下载目录一致)
cd ~/Downloads

# 解压 Kibana 压缩包(替换版本为你下载的版本,和 ES 一致)
tar -zxvf kibana-9.3.0-linux-x86_64.tar.gz

# 进入 Kibana 安装目录
cd kibana-9.3.0

2.2 修改 Kibana 配置文件

原理:让 Kibana 能连接到本地部署的 ES,确保两者通信正常。

# 打开 Kibana 配置文件
vim config/kibana.yml

添加/修改以下配置(按实际情况调整):

# 1. Kibana 端口(默认5601,不用修改)
server.port: 5601

# 2. 绑定本地地址(只允许本地访问)
server.host: "127.0.0.1"

# 3. 连接本地 ES 的地址(和 ES 配置的 http.port 一致)
elasticsearch.hosts: ["http://127.0.0.1:9200"]

# 4. 中文界面(可选,新手建议开启,更易操作)
i18n.locale: "zh-CN"

保存退出(Esc → :wq)。

2.3 启动 Kibana 并登录

# 进入 Kibana 安装目录
cd kibana-9.3.0

# 启动 Kibana(前台启动,能看到启动日志,关闭终端则 Kibana 停止)
./bin/kibana

启动成功后,打开浏览器,访问 http://localhost:5601,进入登录页面:

  • ES9.x 本地部署默认账号:elastic

  • 默认密码:启动 ES 时,日志中会生成默认密码,执行以下命令查看:
    cat elasticsearch-9.3.0/logs/elasticsearch.log | grep "generated initial password for elastic user"
    找到类似「generated initial password for elastic user: xxxxxxxxxxxx」的内容,后面的字符串就是默认密码。

登录后,点击左侧菜单栏「管理」→「Dev Tools」,进入控制台(后续所有 API 命令都在这里执行)。

步骤3:配置 OpenAI 模型(让 ES 能调用 OpenAI)

原理:我们需要在 ES 中注册 OpenAI 模型,告诉 ES “用哪个 OpenAI 模型、用哪个 API 密钥调用”,这样 ES 才能通过推理 API 调用 OpenAI 的对话补全功能。

重点:不要明文填写 API 密钥,用 ES 密钥库存储,避免泄露,步骤如下:

3.1 把 OpenAI API 密钥存入 ES 密钥库

原理:ES 密钥库是专门存储敏感信息(如 API 密钥)的地方,存入后,我们在配置模型时,只需引用密钥库中的变量,不用明文写密钥。

# 进入 ES 安装目录
cd elasticsearch-9.3.0

# 把 OpenAI API 密钥添加到 ES 密钥库(执行后会提示输入密钥,输入时无回显,输完回车)
./bin/elasticsearch-keystore add inference.openai.api_key

# 重启 ES,让密钥生效(必须重启,否则无法引用密钥)
# 先停止 ES:找到 ES 进程 ID
ps -ef | grep elasticsearch
# 关闭 ES(替换 进程ID 为实际查到的ID)
kill -9 进程ID
# 重新启动 ES(后台启动)
./bin/elasticsearch -d

3.2 配置 OpenAI 对话补全模型

打开 Kibana Dev Tools 控制台,输入以下命令(直接复制,无需修改,密钥会自动从密钥库读取):

PUT _inference/completion/openai_chat_completions
{
    "service": "openai",  # 固定值,告诉 ES 用 OpenAI 服务
    "service_settings": {
        "api_key": "${inference.openai.api_key}",  # 引用密钥库中的 OpenAI 密钥
        "model_id": "gpt-3.5-turbo",  # 用的 OpenAI 模型,新手推荐这个(免费额度够用、速度快)
        "temperature": 0.2,  # 生成文本的随机性(0-2),摘要/翻译建议0.1-0.3(越精准)
        "max_tokens": 500,  # 最大生成长度(控制摘要/翻译的字数,按需调整)
        "frequency_penalty": 0.1  # 降低重复文本的概率,避免生成重复内容
    }
}

点击控制台左侧的「运行」按钮,若返回 200 OK,说明模型配置成功,类似响应如下:

{
  "acknowledged": true
}

常见报错解决:

  • API 密钥错误:重新执行步骤3.1,确认密钥输入正确,重启 ES 后再试;

  • 网络不通:本地无法访问 OpenAI API,需配置代理(后面会讲);

  • 模型不存在:确认 model_id 是 OpenAI 支持的(比如 gpt-3.5-turbo、gpt-4,新手用 gpt-3.5-turbo 即可)。

步骤4:实操演示(3个核心功能:问答、摘要、翻译)

原理:配置好模型后,我们可以直接调用模型处理文本(问答),也可以把文本存入 ES,通过「摄入管道」批量处理(摘要、翻译),全程实操,直接复制命令即可。

4.1 功能1:简单问答(直接调用模型)

场景:直接向 OpenAI 提问(比如“什么是 Elasticsearch”),通过 ES API 获取回答,不用单独访问 OpenAI 官网。

在 Kibana 控制台输入以下命令:

POST _inference/completion/openai_chat_completions
{
    "input": "什么是 Elasticsearch?"  # 你的问题,可任意修改
}

运行后,会返回类似以下的回答(ES 调用 OpenAI 生成,精准易懂):

{
  "completion": [
    {
      "result": "Elasticsearch 是一款分布式、RESTful 风格的搜索与分析引擎,是 Elastic Stack 的核心组件。它能高效存储、索引和检索各种类型的数据(包括文本、数值、地理空间数据等),支持近实时搜索和聚合分析,广泛用于日志分析、全文搜索、数据监控等场景。它常与 Logstash(数据采集)、Kibana(数据可视化)、Beats(数据采集)配合使用,组成完整的数据分析解决方案。"
    }
  ]
}

4.2 功能2:文本摘要(批量处理 ES 中的文档)

场景:把长文本存入 ES,通过「摄入管道」批量生成摘要(比如把一篇长文档转化为精简摘要,降低存储成本、方便快速查看)。

分4小步,全程复制命令,不用修改:

第一步:创建存储长文本的索引(相当于“文件夹”,存我们要摘要的文本)
PUT docs  # 索引名:docs,可任意修改,后面要用到

运行后返回200 OK 即可。

第二步:向索引中存入长文本(示例文本,可替换成自己的文本)
POST _bulk
{ "index" : { "_index" : "docs" } }  # 存入 docs 索引
{"content": "Elasticsearch 是 Elastic Stack 的核心分布式搜索与分析引擎,核心定位是「为搜索(和分析)而生」。Logstash 和 Beats 负责采集、聚合、丰富数据并存储至 Elasticsearch;Kibana 支持交互式探索、可视化数据、分享洞察,同时管理和监控整个 Stack;而索引、搜索、分析的核心能力由 Elasticsearch 提供。Elasticsearch 支持近实时的全类型数据搜索与分析,无论是结构化/非结构化文本、数值数据还是地理空间数据,都能高效存储和索引,实现快速检索。你可突破简单的数据查询,通过聚合分析发现数据趋势与模式;且随着数据量和查询量增长,其分布式架构可无缝扩展。尽管并非所有问题都能通过搜索解决,但 Elasticsearch 的高性能与灵活性可适配多种场景:为应用/网站添加搜索框;存储并分析日志、指标、安全事件数据;通过机器学习实时建模数据行为;作为向量数据库创建、存储、搜索向量嵌入;作为存储引擎自动化业务流程;作为 GIS 管理、集成、分析空间信息;作为生物信息学研究工具存储和处理基因数据。"}

运行后,若返回 "errors": false,说明文本存入成功。

第三步:创建摘要摄入管道(相当于“自动化流水线”,自动给文本生成摘要)

原理:管道包含3个步骤:1. 拼接摘要指令(告诉 OpenAI “要总结这段文本”);2. 调用 OpenAI 模型生成摘要;3. 删除临时指令字段(避免冗余数据)。

PUT _ingest/pipeline/summarization_pipeline
{
    "processors": [
        {
            "script": {
                "source": "ctx.prompt = '请总结以下文本,要求简洁明了,不超过300字:' + ctx.content",
                "on_failure": [  # 兜底逻辑:如果脚本执行失败,给摘要设默认值
                    {
                        "set": {
                            "field": "summary",
                            "value": "文本处理失败,无法生成摘要"
                        }
                    }
                ]
            }
        },
        {
            "inference": {
                "model_id": "openai_chat_completions",  # 引用我们之前配置的 OpenAI 模型
                "input_output": {
                    "input_field": "prompt",  # 输入字段:拼接好的指令+文本
                    "output_field": "summary"  # 输出字段:生成的摘要
                },
                "on_failure": [  # 兜底逻辑:如果调用 OpenAI 失败,给摘要设默认值
                    {
                        "set": {
                            "field": "summary",
                            "value": "调用 OpenAI 模型失败,无法生成摘要"
                        }
                    }
                ]
            }
        },
        {
            "remove": {
                "field": "prompt"  # 删除临时指令字段,只保留原文和摘要
            }
        }
    ]
}

运行后返回 200 OK,管道创建成功。

第四步:执行重索引,生成摘要(让管道处理 docs 索引中的文本,生成摘要并存入新索引)
POST _reindex?wait_for_completion=false&scroll=10m&slices=2
{
    "source": {
        "index": "docs",  # 源索引:我们存入长文本的 docs 索引
        "size": 100  # 单批次处理100条,本地部署建议50-200,避免内存不足
    },
    "dest": {
        "index": "docs_summaries",  # 目标索引:存储带摘要的文档
        "pipeline": "summarization_pipeline"  # 调用我们创建的摘要管道
    }
}

运行后,会返回一个任务 ID,说明异步执行中(避免长时间阻塞),我们可以查询生成的摘要:

POST docs_summaries/_search
{
    "query": {
        "match_all": { }  # 查询所有带摘要的文档
    }
}

响应中会包含 content(原文)和 summary(生成的摘要),类似如下:

{
  "hits": {
    "hits": [
      {
        "_source": {
          "content": "Elasticsearch 是 Elastic Stack 的核心分布式搜索与分析引擎...",  # 原文
          "summary": "Elasticsearch 是 Elastic Stack 核心的分布式搜索与分析引擎,主要用于存储、索引和检索各类数据,支持近实时搜索和聚合分析。它与 Logstash、Beats、Kibana 配合使用,适配多种场景,如全文搜索、日志分析、向量数据库等,且分布式架构可随数据量无缝扩展。"  # 生成的摘要
        }
      }
    ]
  }
}

4.3 功能3:文本翻译(修改管道即可实现)

原理:只需修改摄入管道的“指令”,就能让 OpenAI 执行翻译任务(比如把英文文本翻译成中文),步骤如下:

PUT _ingest/pipeline/translation_pipeline
{
    "processors": [
        {
            "script": {
                "source": "ctx.prompt = '请将以下英文文本翻译成中文,要求准确、流畅:' + ctx.content"  # 修改指令为翻译
            }
        },
        {
            "inference": {
                "model_id": "openai_chat_completions",
                "input_output": {
                    "input_field": "prompt",
                    "output_field": "chinese_translation"  # 输出字段改为“中文翻译”
                }
            }
        },
        {
            "remove": {
                "field": "prompt"
            }
        }
    ]
}

创建管道后,重复步骤4.2的“存入文本→重索引”,即可生成翻译结果(只需把重索引中的pipeline 改为 translation_pipeline)。

步骤5:本地部署数据提取服务(可选,处理PDF/Word等二进制文档)

原理:如果我们要处理 PDF、Word 等二进制文档(比如把PDF里的文本提取出来,再生成摘要),可以用 Elastic 开源的 data-extraction-service,用 Docker 快速部署,步骤如下:

  1. 确保本地已安装 Docker(没有安装的话,先安装 Docker);

  2. 克隆仓库并启动服务:`# 克隆仓库
    git clone https://github.com/elastic/data-extraction-service.git
    cd data-extraction-service

启动服务(Docker 后台启动)

docker compose up -d`

  1. 集成到 ES 摄入管道(提取二进制文本后再摘要):
    PUT _ingest/pipeline/binary_doc_summarization { "processors": [ { "http": { # 调用数据提取服务,提取二进制文档文本 "url": "http://localhost:8080/extract", "method": "POST", "body": "{\"file\": {{ctx.content | base64}} }", # 二进制文件转Base64(ES 自动处理) "headers": { "Content-Type": "application/json" }, "target_field": "extracted_text" # 提取后的文本存入这个字段 } }, { "script": { "source": "ctx.prompt = '请总结以下文本:' + ctx.extracted_text.content" } }, { "inference": { "model_id": "openai_chat_completions", "input_output": { "input_field": "prompt", "output_field": "summary" } } } ] }

之后,把二进制文档(PDF/Word)转成 Base64 格式存入 ES,执行重索引,就能自动提取文本并生成摘要。

四、常见问题排查(新手必看)

  1. ES 启动失败,提示“内存不足”:修改 config/jvm.options 中的 -Xms 和 -Xmx,设为更小的值(比如1g),重启 ES。

  2. Kibana 无法连接 ES:检查 ES 是否启动,ES 配置中的 network.host 是否为 127.0.0.1,Kibana 配置中的 elasticsearch.hosts 是否正确。

  3. 调用 OpenAI 模型失败,提示“网络超时”:本地无法直连 OpenAI API,需配置 ES 代理,在 elasticsearch.yml 中添加:
    proxy.host: "你的代理IP" proxy.port: 你的代理端口 proxy.username: "代理用户名(可选)" proxy.password: "代理密码(可选)"
    配置后重启 ES 即可。

  4. 重索引后没有生成摘要/翻译:检查管道配置是否正确,model_id 是否和之前配置的一致,OpenAI API 密钥是否有效,查看 ES 日志排查错误。

五、总结

本地部署 ES9.x + OpenAI 对话补全,核心就4步:

  1. 部署 ES9.x:修改配置(单节点、内存、CORS),启动验证;

  2. 部署 Kibana9.x:配置连接 ES,用 Dev Tools 操作;

  3. 配置 OpenAI 模型:密钥存入 ES 密钥库,注册模型;

  4. 实现功能:调用模型做问答,用摄入管道做摘要/翻译。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐