百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

三步教你用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到在本机上搭一个...

取消回复欢迎 发表评论: