三步教你用Elasticsearch+PyMuPDF实现PDF大文件秒搜!
nanshan 2025-07-03 18:20 1 浏览 0 评论
面对100页以上的大型PDF文件时,阅读和搜索往往效率低下。传统关系型数据库在处理此类数据时容易遇到性能瓶颈,而 Elasticsearch 凭借其强大的全文检索和分布式架构,成为理想解决方案。通过 PyMuPDF 提取PDF文本内容,结合Elasticsearch的倒排索引技术,能够快速定位和检索信息,即使面对海量数据也能保持高效查询。其分布式特性支持多节点扩展,进一步提升性能和可靠性,完美解决传统数据库的性能瓶颈问题。
以下是详细的开发方案:
1. 系统设计
- 功能需求:
(1)支持上传 PDF 文件,并从中提取文本。
(2)支持分词操作以及全文检索。
(3)支持将匹配内容以高亮形式显示。
(4)支持分页展示搜索结果
- 技术栈:
- PyMuPDF:用于解析PDF文件。
- jieba:用于中文分词。
- Elasticsearch:用于存储和检索文本数据。
- Flask:用于构建Web界面和API。
2. 实现步骤
2.1 安装依赖
Python
pip install pymupdf flask jieba elasticsearch
2.2 启动Elasticsearch
(1)下载并安装Elasticsearch
(2)从 Elasticsearch官网(
https://www.elastic.co/cn/elasticsearch) 下载并解压
(3)运行 bin/elasticsearch 启动服务
(4)确保Elasticsearch运行在 http://localhost:9200
2.3 解析PDF并存入Elasticsearch
使用PyMuPDF提取PDF文本,并将文本数据存入Elasticsearch:
Python
import fitz # PyMuPDF
from elasticsearch import Elasticsearch
import jieba
# 连接Elasticsearch
es = Elasticsearch("http://localhost:9200")
def extract_and_store_pdf(filepath):
# 提取文件名
filename = filepath.split('/')[-1]
# 解析PDF
doc = fitz.open(filepath)
for page_num in range(len(doc)):
page = doc.load_page(page_num)
text = page.get_text()
# 对文本进行分词
tokens = jieba.lcut(text)
# 存入Elasticsearch
doc_data = {
"filename": filename,
"page": page_num + 1,
"text": text,
"tokens": tokens
}
es.index(index="pdf_documents", body=doc_data)
# 示例:解析并存储PDF
extract_and_store_pdf('example.pdf')
2.4 实现分词搜索
使用Elasticsearch的全文检索功能实现分词搜索:
Python
def search_keyword(keyword):
# 对关键词进行分词
keyword_tokens = jieba.lcut(keyword)
# 构建Elasticsearch查询
query = {
"query": {
"match": {
"tokens": " ".join(keyword_tokens) # 将分词结果组合成查询字符串
}
},
"highlight": {
"fields": {
"text": {} # 高亮显示匹配内容
}
}
}
# 执行查询
response = es.search(index="pdf_documents", body=query)
return response['hits']['hits']
# 示例:搜索关键词
results = search_keyword('Python编程')
for hit in results:
print(f"文件: {hit['_source']['filename']}, 页码: {hit['_source']['page']}")
print(f"内容: {hit['highlight']['text'][0]}")
2.5 构建Web界面
使用Flask构建一个简单的Web界面,支持文件上传和搜索:
Python
from flask import Flask, render_template, request, redirect, url_for
import os
app = Flask(__name__)
UPLOAD_FOLDER = 'uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# 首页:上传文件
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
file = request.files['file']
if file:
filepath = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
file.save(filepath)
extract_and_store_pdf(filepath)
return redirect(url_for('index'))
return render_template('index.html')
# 搜索页面
@app.route('/search', methods=['GET'])
def search():
keyword = request.args.get('keyword')
if keyword:
results = search_keyword(keyword)
return render_template('search.html', results=results, keyword=keyword)
return render_template('search.html')
if __name__ == '__main__':
if not os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER)
app.run(debug=True)
2.6 创建HTML模板
在 templates 目录下创建以下HTML文件:
index.html(文件上传页面):
html
search.html(搜索页面):
html
3. 运行系统
(1) 启动Elasticsearch:
bash
bin/elasticsearch
(2) 启动Flask应用:
bash
python app.py
(3) 访问 http://127.0.0.1:5000,上传PDF文件。
(4) 访问
http://127.0.0.1:5000/search,输入关键词搜索。
4. 功能扩展
- 分页显示:在Elasticsearch查询中添加 from 和 size 参数,实现分页。
- 停用词过滤:在分词时过滤常见停用词(如“的”、“是”)。
- 词性标注:结合词性标注(如名词、动词)提升搜索精度。
- 性能优化:使用Elasticsearch的分布式特性,支持大规模数据检索。
- 语义化搜索:通过理解用户意图和上下文,返回相关结果,而非简单关键词匹配。
通过以上步骤,你可以构建一个高性能的PDF文件搜索系统!
创作不易,您的建议,是我们进步的动力!欢迎留言及加关注,帮助我们做得更好!
相关推荐
- 在 Ubuntu 上安装 Zabbix(以 Zabbix 6.4 LTS 版本为例)
-
Zabbix是一个流行的开源监控解决方案,能够监控各种网络参数和服务器健康状态。一、环境准备系统要求Ubuntu20.04/22.04LTS至少2GBRAM(生产环境建议4GB+)至少1...
- 如何在 Ubuntu 24.04 服务器上安装 Apache Solr
-
ApacheSolr是一个免费、开源的搜索平台,广泛应用于实时索引。其强大的可扩展性和容错能力使其在高流量互联网场景下表现优异。Solr基于Java开发,提供了分布式索引、复制、负载均衡及自...
- 如何在 Ubuntu 24.04 LTS 或 22.04/20.04 上安装 Apache Maven
-
Maven是由Apache托管的开源工具,用于管理Java项目。它包含一个项目对象模型(POM):一个配置文件(XML),其中包含项目的基本信息,包括配置、项目依赖项等。Maven可以处理...
- Cursor的终极对手——Trae Pro最新系统提示词
-
前段时间,字节的AI编程神器Trae国际版,终于甩出了Pro订阅计划!很多对它又爱又恨的小伙伴,直呼:终于等到你。爱它,是因为Trae长期免费+体验真香;恨它?还不是那该死的排队等待,...
- AI系统提示词:V0(ai代码提示)
-
以下是对V0系统提示词(SystemPrompt)的分部分讲解与解读,帮助你理解其核心内容和设计意图。V0系统提示词##CoreIdentity-Youarev0,Vercel&...
- 8岁男童失踪第13天,搜救人员发现可疑水库,更恶心的事情发生了
-
Lookingatyourrequest,Ineedtorewritethearticleaboutthe8-year-oldmissingboywhilemaking...
- docker常用指令及安装rabbitMQ(docker安装zabbix)
-
一、docker常用指令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestart...
- 三步教你用Elasticsearch+PyMuPDF实现PDF大文件秒搜!
-
面对100页以上的大型PDF文件时,阅读和搜索往往效率低下。传统关系型数据库在处理此类数据时容易遇到性能瓶颈,而Elasticsearch凭借其强大的全文检索和分布式架构,成为理想解决方案。通过...
- ElasticSearch中文分词插件(IK)安装
-
坚持原创,共同进步!请关注我,后续分享更精彩!!!前言ElasticSearch默认的分词插件对中文支持很不友好。一段话按规则会以每个中文字符来拆解,再分别建立倒排索引。如"中华人民共和国国歌...
- SpringBoot使用ElasticSearch做文档对象的持久化存储?
-
ElasticSearch是一个基于Lucene的开源搜索引擎,广泛应用于日志分析、全文搜索、复杂查询等领域,在有些场景中使用ElasticSearch进行文档对象的持久化存储是一个很不错的选择...
- Elasticsearch数据迁移方案(elasticsearch copyto)
-
前言最近小编要去给客户部署一套系统涉及到了Mysql和ES数据的迁移,下面就给大家分享一下ES数据迁移的几套方案,根据具体的使用场景来选择不同的迁移方案能使你事倍功半,话多说下面就一一介绍。Elast...
- Rancher部署单体ElasticSearch(rancher2.5部署)
-
Rancher是k8s图形管理界面,之前曾有写文章介绍如何安装。ElasticSearch是热门搜索引擎,很多地方都有用到,常规安装部署略显繁琐,本文介绍在k8s下用rancher简易部署ES。1.在...
- Elasticsearch在Java项目的搜索实践:从零开始构建高效搜索系统
-
Elasticsearch在Java项目中的搜索实践:从零开始构建高效搜索系统在现代的Java项目中,数据量激增,传统的数据库查询方式已经无法满足快速检索的需求。这时,Elasticsearch(E...
- 小白入门-Kibana安装(kibana安装配置)
-
一Kibana基础1.1介绍Kibana是一款免费且开放的前端应用程序,其基础是ElasticStack,可以为Elasticsearch中索引的数据提供搜索和数据可视化功能。Kiban...
- Docker上使用Elasticsearch,Logstash,Kibana
-
在对一个项目做性能测试时我需要处理我们web服务器的访问日志来分析当前用户的访问情况。因此,我想这是试用ELK的一个好机会。ELK栈首先要注意的是使用它是非常简单的。从决定使用ELK到在本机上搭一个...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 在 Ubuntu 上安装 Zabbix(以 Zabbix 6.4 LTS 版本为例)
- 如何在 Ubuntu 24.04 服务器上安装 Apache Solr
- 如何在 Ubuntu 24.04 LTS 或 22.04/20.04 上安装 Apache Maven
- Cursor的终极对手——Trae Pro最新系统提示词
- AI系统提示词:V0(ai代码提示)
- 8岁男童失踪第13天,搜救人员发现可疑水库,更恶心的事情发生了
- docker常用指令及安装rabbitMQ(docker安装zabbix)
- 三步教你用Elasticsearch+PyMuPDF实现PDF大文件秒搜!
- ElasticSearch中文分词插件(IK)安装
- SpringBoot使用ElasticSearch做文档对象的持久化存储?
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)