Elasticsearch+Jina 模型
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 最终能实现的效果
-
完全本地化部署:所有数据、模型、检索全在自己的电脑/服务器上,无外网依赖、无数据泄露风险、无付费订阅要求
-
中文语义检索:搜一句话,能找到意思匹配的文档,不用死抠关键词
-
生产级可用:支持长文档处理、混合搜索、重排序优化,直接能用来做企业知识库、RAG问答机器人
-
低配电脑也能跑: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)
操作步骤
-
官网下载对应系统的安装包:https://www.elastic.co/cn/downloads/elasticsearch
-
解压到本地无中文、无空格的路径(比如Windows:
D:\elasticsearch-9.3.0,Linux:/opt/elasticsearch-9.3.0) -
修改配置文件(关键!否则后续无法对接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
-
启动ES
-
Windows:双击解压目录下的
bin\elasticsearch.bat -
Linux/macOS:终端进入解压目录,执行
./bin/elasticsearch
-
-
验证是否启动成功
打开浏览器/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中文分词器。
操作步骤
-
下载和你的ES版本完全一致的IK分词器:https://github.com/medcl/elasticsearch-analysis-ik/releases
-
在ES解压目录的
plugins文件夹下,新建一个ik文件夹 -
把下载的IK压缩包解压到
plugins/ik文件夹里 -
重启ES服务(必须重启才能加载插件)
-
验证是否安装成功
执行下面的API请求,能正常返回分词结果就是成功:
POST _analyze
{
"analyzer": "ik_max_word",
"text": "ES本地部署Jina模型教程"
}
2.2.3 安装Ollama(一键部署AI模型)
操作步骤
-
官网下载对应系统的安装包:https://ollama.com/
-
一键安装,全程下一步即可
-
启动Ollama(安装后会自动启动,Windows右下角能看到图标,Linux会自动注册系统服务)
-
开启Ollama的外网访问(ES和Ollama不在同一台机器必须做,同一台可跳过)
-
Windows:右键此电脑→属性→高级系统设置→环境变量→新建系统变量,变量名
OLLAMA_HOST,变量值0.0.0.0,确定后重启Ollama -
Linux/macOS:终端执行
export OLLAMA_HOST=0.0.0.0,然后重启Ollama服务
-
-
验证是否安装成功
打开终端/CMD,执行 ollama -v,返回版本号就是安装成功;再执行 curl http://localhost:11434/api/version,返回版本信息就是服务正常。
三、核心操作:ES 9.x 打通本地Ollama的Jina模型
3.1 第一步:用Ollama拉取Jina模型(本地安装)
先选适合你配置的模型,新手直接按表格选,不用纠结。
【模型选型表】
| 你的情况 | 嵌入模型选这个 | 重排序模型选这个 |
|---|---|---|
| 电脑配置一般(8G内存、无显卡) | jina-embeddings-v5-text-nano | jina-reranker-v2 |
| 要处理长文档(合同、论文、几万字内容) | jina-embeddings-v5-text-small | jina-reranker-v3 |
| 多语言场景、要稳定成熟 | jina-embeddings-v3 | jina-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_id和dimensions即可。
所有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 第四步:语义检索实战(关键词+向量混合检索+重排序优化)
这是生产环境最优的检索架构:关键词检索+向量语义检索混合召回,再用重排序模型做精准排序,兼顾召回率和准确率。
原理大白话:
-
关键词检索:精准匹配专有名词,比如「ES」「Ollama」,不会漏了带关键词的文档
-
向量检索:匹配语义,比如搜「怎么本地装AI模型」,能找到Ollama的教程,哪怕没有完全匹配关键词
-
重排序:把前面召回的结果,再精准打分排序,把最匹配的放在最前面
# 生产级语义检索请求
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超长文本,直接把几万字的文档丢进去,会导致入库慢、检索精度下降
-
最优方案:
-
普通文档:单块大小2048-4096 tokens(约1500-3000个汉字),块与块之间保留10%-15%的重叠内容,避免语义断裂
-
超长文档(论文/合同):单块最大不超过8192 tokens,优先对标题、摘要、核心段落做向量化
-
网页/爬虫内容:只对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创建推理端点报错,提示无法连接Ollama | 1. 检查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_id和input_field、output_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_candidates和k的值;3. 给ES分配更多内存,开启向量索引优化;4. 用轻量化的nano模型 |
| 重排序报错 | 1. 检查重排序端点的model_id有没有写错;2. jina-reranker-v2单文档最大支持1024 tokens,提前截取核心内容,不要输入超长文本;3. 控制单次检索的size不超过64(v3模型最大支持64个候选文档) |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)