Elasticsearch+Jina 模型

1.1 核心概念

专业术语解释+生活类比核心用处
嵌入模型(Embedding)给文本生成专属语义身份证号:意思相近的文本,身份证号也高度相似。
比如「苹果手机」和「iPhone」的身份证号离得很近,和「苹果水果」离得很远。
解决传统关键词搜索的痛点:不用完全匹配关键词,也能找到「意思对得上」的内容,比如搜「怎么给电脑装系统」,能找到「PC系统安装教程」的文档。
重排序模型(Reranker)「海选+终面」的终面环节:
第一步用嵌入模型快速「海选」出100个相关文档;第二步用重排序模型挨个给文档打分,精准挑出最匹配的前5个。
花极小的时间成本,把搜索结果的准确率拉满,尤其适合做知识库、RAG问答机器人。
Jina模型一套开源、免费、多语言支持极强的AI模型,专门做文本嵌入和重排序,是目前本地部署语义搜索的最优选择之一。不用付费买商业模型,本地就能跑,中文、英文等多语言效果都很好,适配ES原生能力。
Ollama一键安装、一键启动AI模型的工具,相当于「AI模型的应用商店」,不用搞复杂的Python环境、显卡配置,一行命令就能把Jina模型装在自己的电脑/服务器上。完全本地化部署,数据不会外传,不用给Elastic付费,不用配置复杂的ES机器学习节点,新手也能搞定。
ES 9.3+ 版本只有9.3及以上的Elasticsearch版本,才原生支持直接对接Ollama,不用装一堆第三方插件,几行配置就能打通AI能力。省去大量插件适配、环境调试的时间,直接用ES原生的语义搜索、向量检索能力。
套娃表示学习(MRL)就像图片压缩:原图1024像素,压缩成512像素,肉眼几乎看不出区别,但文件小了一半、加载快了一倍。
MRL就是Jina模型自带的「向量压缩能力」,可以把1024维的向量压缩到512/256维,精度几乎不丢,存储成本减半、搜索速度翻倍。
低配电脑也能流畅跑,高并发场景也不卡,不用牺牲效果换性能。
input_type参数模型给「入库的文档」和「用户的查询句」做了专属优化:
- ingest:文档入库用,生成的向量适合长期存储、归档语义;
- search:用户查询用,生成的向量适合和入库的向量做匹配。
就像给书做目录用归档逻辑,找书用搜索逻辑,两者对应上,搜索匹配度直接提升。

1.2 最终能实现的效果

  1. 完全本地化部署:所有数据、模型、检索全在自己的电脑/服务器上,无外网依赖、无数据泄露风险、无付费订阅要求

  2. 中文语义检索:搜一句话,能找到意思匹配的文档,不用死抠关键词

  3. 生产级可用:支持长文档处理、混合搜索、重排序优化,直接能用来做企业知识库、RAG问答机器人

  4. 低配电脑也能跑:8G内存的普通办公电脑,也能跑通全流程


二、前置环境准备:

2.1 硬件要求(最低可运行配置)

用途最低配置推荐配置
测试/学习(轻量模型)4核CPU + 8G内存6核CPU + 16G内存
生产/长文档(主力模型)8核CPU + 16G内存8核CPU + 32G内存 + 8G以上显存的NVIDIA显卡

2.2 软件安装(按顺序操作)

2.2.1 安装Elasticsearch 9.x(最低9.3.0)
操作步骤
  1. 官网下载对应系统的安装包:https://www.elastic.co/cn/downloads/elasticsearch

  2. 解压到本地无中文、无空格的路径(比如Windows:D:\elasticsearch-9.3.0,Linux:/opt/elasticsearch-9.3.0

  3. 修改配置文件(关键!否则后续无法对接Ollama)

打开解压目录下的 config/elasticsearch.yml,把以下配置复制进去,替换原有同名配置:


# 开启ES的推理API(核心,对接AI模型必须开)
xpack.inference.enabled: true

# 允许ES被本地/内网访问,不用改IP
http.host: 0.0.0.0
transport.host: 0.0.0.0

# 关闭安全校验(测试环境用,生产环境请配置账号密码)
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false

# 跨域配置(后续对接前端/工具必须开)
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-methods: [OPTIONS, HEAD, GET, POST, PUT, DELETE]
http.cors.allow-headers: X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization
  1. 启动ES

    • Windows:双击解压目录下的 bin\elasticsearch.bat

    • Linux/macOS:终端进入解压目录,执行 ./bin/elasticsearch

  2. 验证是否启动成功

打开浏览器/Postman,访问 http://localhost:9200,如果返回类似下面的JSON,就是启动成功:


{
  "name" : "你的电脑名",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "9.5.0",
    "build_flavor" : "default"
  },
  "tagline" : "You Know, for Search"
}
踩坑提示
  • Windows启动报错:提示「无法找到Java」,ES自带Java,不用单独装,右键以管理员身份运行elasticsearch.bat即可

  • Linux启动报错:提示「不能用root用户启动」,新建一个普通用户,给ES目录赋权后再启动

  • 启动后浏览器访问不到:检查Windows防火墙/Linux防火墙是否放行9200端口

2.2.2 安装中文分词器IK(中文检索必须装)

ES默认的分词器会把中文拆成单个字,搜索效果极差,必须装IK中文分词器。

操作步骤
  1. 下载和你的ES版本完全一致的IK分词器:https://github.com/medcl/elasticsearch-analysis-ik/releases

  2. 在ES解压目录的 plugins 文件夹下,新建一个 ik 文件夹

  3. 把下载的IK压缩包解压到 plugins/ik 文件夹里

  4. 重启ES服务(必须重启才能加载插件)

  5. 验证是否安装成功

执行下面的API请求,能正常返回分词结果就是成功:


POST _analyze
{
  "analyzer": "ik_max_word",
  "text": "ES本地部署Jina模型教程"
}
2.2.3 安装Ollama(一键部署AI模型)
操作步骤
  1. 官网下载对应系统的安装包:https://ollama.com/

  2. 一键安装,全程下一步即可

  3. 启动Ollama(安装后会自动启动,Windows右下角能看到图标,Linux会自动注册系统服务)

  4. 开启Ollama的外网访问(ES和Ollama不在同一台机器必须做,同一台可跳过)

    • Windows:右键此电脑→属性→高级系统设置→环境变量→新建系统变量,变量名OLLAMA_HOST,变量值0.0.0.0,确定后重启Ollama

    • Linux/macOS:终端执行 export OLLAMA_HOST=0.0.0.0,然后重启Ollama服务

  5. 验证是否安装成功

打开终端/CMD,执行 ollama -v,返回版本号就是安装成功;再执行 curl http://localhost:11434/api/version,返回版本信息就是服务正常。


三、核心操作:ES 9.x 打通本地Ollama的Jina模型

3.1 第一步:用Ollama拉取Jina模型(本地安装)

先选适合你配置的模型,新手直接按表格选,不用纠结。

【模型选型表】
你的情况嵌入模型选这个重排序模型选这个
电脑配置一般(8G内存、无显卡)jina-embeddings-v5-text-nanojina-reranker-v2
要处理长文档(合同、论文、几万字内容)jina-embeddings-v5-text-smalljina-reranker-v3
多语言场景、要稳定成熟jina-embeddings-v3jina-reranker-v3
拉取模型操作

打开终端/CMD,执行对应命令,Ollama会自动下载、安装、启动模型:


# 【低配首选】轻量嵌入模型,239M参数,CPU就能跑
ollama pull jina/jina-embeddings-v5-text-nano

# 【主力首选】平衡型嵌入模型,支持32k超长文本
ollama pull jina/jina-embeddings-v5-text-small

# 【成熟稳定】经典嵌入模型,多语言支持最好
ollama pull jina/jina-embeddings-v3

# 【高精度首选】重排序模型,检索结果最准
ollama pull jina/jina-reranker-v3

# 【轻量首选】重排序模型,CPU就能跑
ollama pull jina/jina-reranker-v2-base-multilingual
验证模型本地可正常运行

拉取完成后,执行下面的命令,测试模型能不能正常生成向量/重排序,避免后续ES对接出问题:


# 测试嵌入模型(把nano换成你拉的模型名)
curl http://localhost:11434/api/embeddings -H "Content-Type: application/json" -d '{
  "model": "jina/jina-embeddings-v5-text-nano",
  "prompt": "测试文本"
}'

✅ 成功标志:返回包含embedding字段的JSON,里面是一串数字(就是生成的向量)。


# 测试重排序模型(把v3换成你拉的模型名)
curl http://localhost:11434/api/rerank -H "Content-Type: application/json" -d '{
  "model": "jina/jina-reranker-v3",
  "query": "山脉",
  "documents": ["瑞士阿尔卑斯山", "鹅卵石", "冰川"]
}'

✅ 成功标志:返回包含results字段的JSON,里面给每个文档打了相关性分数、排了序。


3.2 第二步:ES创建对接Ollama的推理端点

这一步是核心,让ES能直接调用本地Ollama里的Jina模型。

关键解释:为什么ES对接Ollama用openai的service?因为Ollama实现了和OpenAI完全兼容的API接口,ES不用单独做适配,直接用现成的OpenAI对接能力,就能无缝打通Ollama。

3.2.1 创建嵌入模型推理端点

以【主力首选】jina-embeddings-v5-text-small为例,其他模型只需要替换model_iddimensions即可。

所有API请求,都可以在Kibana的Dev Tools里执行,也可以用Postman/APIFox执行,新手推荐装Kibana(和ES同版本),操作最方便。


# 创建嵌入模型推理端点,端点id自定义为ollama-jina-embedding-main
PUT _inference/text_embedding/ollama-jina-embedding-main
{
  "service": "openai", // 固定值,用OpenAI兼容接口对接Ollama
  "service_settings": {
    "model_id": "jina/jina-embeddings-v5-text-small", // 你在Ollama里拉的模型名,必须完全一致
    "url": "http://localhost:11434/v1", // Ollama服务地址,不在同一台机器就换内网IP
    "api_key": "ollama", // Ollama默认不需要密钥,随便填非空值即可
    "organization_id": "default"
  },
  "task_settings": {
    "dimensions": 1024, // 模型默认输出维度,nano模型填768,v3模型填1024
    "input_type": "ingest", // 入库默认用ingest,查询时会自动切换
    "encoding_format": "float" // 向量格式,固定值
  }
}
验证端点是否创建成功

执行下面的请求,测试ES能不能正常调用模型生成向量:


POST _inference/text_embedding/ollama-jina-embedding-main
{
  "input": "ES 9.x 本地部署Jina模型测试",
  "input_type": "ingest"
}

✅ 成功标志:返回包含predicted_value字段的JSON,里面是1024个浮点数(就是生成的向量),没有报错。

3.2.2 创建重排序模型推理端点

以【高精度首选】jina-reranker-v3为例,其他模型替换model_id即可。


# 创建重排序模型推理端点,端点id自定义为ollama-jina-rerank-main
PUT _inference/rerank/ollama-jina-rerank-main
{
  "service": "openai", // 固定值
  "service_settings": {
    "model_id": "jina/jina-reranker-v3", // Ollama里的模型名,必须完全一致
    "url": "http://localhost:11434/v1", // Ollama服务地址
    "api_key": "ollama" // 固定非空值即可
  },
  "task_settings": {
    "top_n": 5, // 最终返回前N个最相关的结果,可自定义
    "return_documents": true // 是否返回原始文本,方便调试
  }
}
验证端点是否创建成功

执行下面的请求,测试ES能不能正常调用重排序模型:


POST _inference/rerank/ollama-jina-rerank-main
{
  "input": ["ES向量检索", "MySQL数据库", "Elasticsearch语义搜索", "Redis缓存"],
  "query": "ES本地部署Jina模型"
}

✅ 成功标志:返回的结果里,把「Elasticsearch语义搜索」「ES向量检索」排在最前面,给了最高的相关性分数,没有报错。


四、全流程实战:从0建一个能用的语义检索库

前面的环境和对接都搞定了,现在我们做一个完整的「文档自动入库→自动生成向量→语义检索→重排序优化」全流程,新手直接复制就能跑。

4.1 第一步:创建语义检索索引(存文档+向量)

我们创建一个叫knowledge_base的知识库索引,专门存文档内容和对应的语义向量。

关键参数解释:

  • dense_vector:专门存向量的字段类型,dims必须和模型输出的维度完全一致(比如1024)

  • similarity: "cosine":余弦相似度,语义检索的首选算法,专门用来计算两个向量的语义相似度

  • index: true:必须开启,否则无法做向量检索


# 创建知识库索引
PUT knowledge_base
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "ik_max_word" // 中文分词,标题用细粒度分词,搜关键词也能找到
      },
      "content": {
        "type": "text",
        "analyzer": "ik_max_word" // 正文用中文分词
      },
      "content_vector": {
        "type": "dense_vector", // 向量字段,存模型生成的语义向量
        "dims": 1024, // 和你的嵌入模型维度一致,nano模型填768
        "index": true, // 开启索引,才能做向量检索
        "similarity": "cosine" // 语义检索首选余弦相似度
      }
    }
  }
}

4.2 第二步:创建自动向量化流水线(Ingest Pipeline)

这个流水线的作用:你把文档丢进ES,它自动给正文生成语义向量,存到 content_vector 字段里,不用你自己先生成向量再写进去,完全自动化。

类比:就像快递自动分拣流水线,你把快递丢进去,它自动扫码、分类、入库,全程不用手动操作。


# 创建自动向量化流水线
PUT _ingest/pipeline/knowledge_base_embedding_pipeline
{
  "description": "自动给content字段生成Jina语义向量",
  "processors": [
    {
      "inference": {
        "model_id": "ollama-jina-embedding-main", // 你刚才创建的嵌入模型端点id,必须完全一致
        "input_output": {
          "input_field": "content", // 要生成向量的文本字段,这里是正文
          "output_field": "content_vector" // 生成的向量存到这个字段里
        },
        "inference_config": {
          "text_embedding": {
            "input_type": "ingest" // 入库固定用ingest,模型会做入库优化
          }
        }
      }
    }
  ]
}

4.3 第三步:文档自动入库测试

我们写入几篇测试文档,看看能不能自动生成向量。

关键:写入的时候必须加上?pipeline=knowledge_base_embedding_pipeline,指定用我们刚才创建的自动流水线,否则不会自动生成向量。


# 写入第一篇测试文档
POST knowledge_base/_doc?pipeline=knowledge_base_embedding_pipeline
{
  "title": "ES 9.x 本地部署Jina模型完整教程",
  "content": "Elasticsearch 9.3及以上版本,可以通过Ollama本地部署Jina嵌入模型和重排序模型,实现完全私有化的语义检索,不用依赖Elastic官方云服务,不用付费订阅,数据全在本地,支持中文多语言检索和RAG问答场景落地。"
}

# 写入第二篇测试文档
POST knowledge_base/_doc?pipeline=knowledge_base_embedding_pipeline
{
  "title": "Ollama一键安装AI模型教程",
  "content": "Ollama是一款开源的AI模型部署工具,支持Windows、Linux、macOS全平台,一行命令就能拉取并运行Jina、Llama3等开源AI模型,不用配置复杂的Python环境和显卡驱动,新手也能快速上手。"
}

# 写入第三篇测试文档
POST knowledge_base/_doc?pipeline=knowledge_base_embedding_pipeline
{
  "title": "MySQL数据库安装教程",
  "content": "MySQL是一款开源的关系型数据库,支持Windows、Linux系统,主要用来存储结构化数据,比如用户信息、订单数据,是Web开发最常用的数据库之一。"
}
验证向量是否自动生成成功

执行下面的查询,看看文档里有没有content_vector字段:


GET knowledge_base/_search
{
  "query": {
    "exists": {
      "field": "content_vector"
    }
  }
}

✅ 成功标志:返回的3篇文档里,都有content_vector字段,里面是一串数字,说明自动向量化成功。

4.4 第四步:语义检索实战(关键词+向量混合检索+重排序优化)

这是生产环境最优的检索架构:关键词检索+向量语义检索混合召回,再用重排序模型做精准排序,兼顾召回率和准确率。

原理大白话:

  1. 关键词检索:精准匹配专有名词,比如「ES」「Ollama」,不会漏了带关键词的文档

  2. 向量检索:匹配语义,比如搜「怎么本地装AI模型」,能找到Ollama的教程,哪怕没有完全匹配关键词

  3. 重排序:把前面召回的结果,再精准打分排序,把最匹配的放在最前面


# 生产级语义检索请求
POST knowledge_base/_search
{
  "query": {
    "hybrid": { // 混合检索,同时执行关键词+向量检索
      "queries": [
        // 第一部分:关键词检索,占30%权重
        {
          "match": {
            "content": {
              "query": "ES本地部署AI模型",
              "boost": 0.3 // 权重,可根据场景调整
            }
          }
        },
        // 第二部分:向量语义检索,占70%权重
        {
          "knn": {
            "field": "content_vector", // 存向量的字段
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "ollama-jina-embedding-main", // 嵌入模型端点id
                "model_text": "ES本地部署AI模型", // 用户的查询句
                "inference_config": {
                  "input_type": "search" // 查询固定用search,模型会做查询优化
                }
              }
            },
            "k": 20, // 召回前20个最相关的文档
            "num_candidates": 100, // 先从全库筛选100个候选,再计算相似度,提升速度
            "boost": 0.7 // 权重,语义检索占比更高
          }
        }
      ]
    }
  },
  // 第三部分:重排序优化,把召回的结果再精准排序
  "rank": {
    "rerank": {
      "model_id": "ollama-jina-rerank-main", // 重排序模型端点id
      "context": {
        "query": "ES本地部署AI模型" // 和用户的查询句一致
      },
      "fields": [
        "content" // 用来做重排序的核心字段,一般是正文
      ]
    }
  },
  "size": 5 // 最终返回前5个最匹配的结果
}

✅ 成功标志:返回的结果里,「ES 9.x 本地部署Jina模型完整教程」排在第一位,「Ollama一键安装AI模型教程」排在第二位,「MySQL数据库安装教程」排在最后,完全符合语义匹配的预期。


五、新手也能懂的优化技巧:让检索又快又准

5.1 文本分块优化(长文档必看)

  • 问题:哪怕模型支持32k超长文本,直接把几万字的文档丢进去,会导致入库慢、检索精度下降

  • 最优方案:

    1. 普通文档:单块大小2048-4096 tokens(约1500-3000个汉字),块与块之间保留10%-15%的重叠内容,避免语义断裂

    2. 超长文档(论文/合同):单块最大不超过8192 tokens,优先对标题、摘要、核心段落做向量化

    3. 网页/爬虫内容:只对title、description、summary字段做向量化,正文分块后再处理

5.2 向量维度压缩优化(低配电脑必看)

利用Jina模型自带的MRL套娃学习能力,压缩向量维度:

  • 操作方法:创建嵌入端点的时候,把dimensions从1024改成512/256

  • 效果:

    • 1024维→512维:存储成本减半,检索速度提升2倍,精度损失小于2%

    • 1024维→256维:存储成本减75%,检索速度提升4倍,精度损失小于5%

  • 适用场景:测试环境、低配电脑、高并发生产环境

5.3 模型选型优化

场景最优模型组合
测试/学习/低配电脑nano嵌入模型 + v2重排序模型
长文档/企业知识库v5-small嵌入模型 + v3重排序模型
多语言/跨境业务v3嵌入模型 + v3重排序模型
高并发/低延迟场景nano嵌入模型 + 关闭重排序(或v2重排序)

六、踩坑排查

6.1 环境安装环节

现象排查步骤+解决方法
ES启动失败1. 检查路径有没有中文、空格;2. Windows以管理员身份运行;3. Linux不用root用户启动;4. 检查端口9200有没有被占用
IK分词器安装后ES启动失败1. 检查IK版本和ES版本完全一致;2. 检查解压后的文件是不是直接在plugins/ik目录下,没有嵌套文件夹
Ollama拉取模型失败1. 检查网络能不能访问外网;2. 换国内镜像源;3. 检查磁盘空间够不够(单个模型约1-3GB)

6.2 ES对接Ollama环节

现象排查步骤+解决方法
ES创建推理端点报错,提示无法连接Ollama1. 检查Ollama服务是否正常启动,访问http://localhost:11434/api/version能不能通;2. ES和Ollama不在同一台机器,把localhost换成Ollama的内网IP;3. 检查防火墙有没有放行11434端口;4. 确认Ollama开启了OLLAMA_HOST=0.0.0.0
调用嵌入端点报错,提示模型不存在1. 检查model_id是不是和Ollama里的模型名完全一致,包括前缀jina/;2. 执行ollama list确认模型已经拉取成功;3. 重启Ollama服务

6.3 文档入库环节

现象排查步骤+解决方法
文档写入后,没有生成向量1. 检查写入的时候有没有加?pipeline=xxx,指定了自动流水线;2. 检查流水线里的model_idinput_fieldoutput_field有没有写错;3. 检查ES日志,看流水线执行有没有报错
入库速度特别慢1. 优化文本分块,减小单块大小;2. 用轻量化的nano模型;3. 给Ollama分配更多CPU/显存资源;4. 批量写入文档,不要单条循环写入

6.4 检索环节

现象排查步骤+解决方法
检索结果匹配度极低1. 检查入库用的input_type=ingest,查询用的input_type=search,两者必须对应;2. 检查索引里的向量维度和模型输出维度完全一致;3. 加上重排序环节,大幅提升准确率;4. 优化文本分块,避免语义碎片化
检索速度特别慢1. 压缩向量维度,从1024降到512/256;2. 减小num_candidatesk的值;3. 给ES分配更多内存,开启向量索引优化;4. 用轻量化的nano模型
重排序报错1. 检查重排序端点的model_id有没有写错;2. jina-reranker-v2单文档最大支持1024 tokens,提前截取核心内容,不要输入超长文本;3. 控制单次检索的size不超过64(v3模型最大支持64个候选文档)
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐