一、基础环境部署与组件安装
本方案基于Elasticsearch 8.12.0构建核心检索引擎,配合Python进行数据处理。首先需要准备Linux服务器环境(推荐CentOS 7.9或Ubuntu 20.04),确保内存至少4GB,硬盘空间根据档案量预留。
1. 安装JDK环境
Elasticsearch依赖Java运行环境。执行以下命令安装OpenJDK 17:
```bash
更新软件源并安装JDK 17
sudo apt-get update
sudo apt-get install -y openjdk-17-jdk
验证安装版本
java -version
```
2. 部署Elasticsearch服务
直接下载官方发布包进行安装,避免使用包管理器导致的版本不一致问题。执行以下命令:
```bash
下载Elasticsearch 8.12.0
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.12.0-linux-x86_64.tar.gz
解压
tar -xzf elasticsearch-8.12.0-linux-x86_64.tar.gz
cd elasticsearch-8.12.0
```
修改配置文件config/elasticsearch.yml以适配内网环境及开发调试。以下是完整的配置内容:
```yaml
cluster.name: archives-cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
关闭安全认证以便于内网工具快速对接(生产环境建议开启)
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
```
由于Elasticsearch禁止Root用户启动,需创建专用用户:
```bash
sudo adduser es_user
sudo chown -R es_user:es_user /path/to/elasticsearch-8.12.0
su es_user
./bin/elasticsearch -d
```
3. 安装中文分词插件
事业单位档案包含大量专有名词,需安装IK分词器。在Elasticsearch目录下执行:
```bash
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.12.0/elasticsearch-analysis-ik-8.12.0.zip
```
安装完成后需重启服务:
```bash
查找进程并杀掉
ps aux | grep elasticsearch
kill -9 [PID]
重新启动
./bin/elasticsearch -d
```
二、文件内容提取环境搭建
档案多为PDF或扫描件图片,需使用Apache Tika进行文本识别。为了零门槛快速落地,使用Docker运行Tika服务。
1. 安装Docker并启动Tika
```bash
安装Docker(如果尚未安装)
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
启动Tika Server(包含OCR能力)
docker run -d -p 9998:9998 --name tika apache/tika:latest-full
```
验证Tika是否可用:
```bash
curl -X GET http://localhost:9998/
```
三、档案数据索引脚本开发
创建Python脚本将本地档案文件读取、解析并推送到Elasticsearch。首先安装依赖:
```bash
pip install elasticsearch tika requests
```

新建文件index_archives.py,写入以下完整代码。该脚本会自动创建索引,并处理指定目录下的PDF文件。
```python
import os
import tika
from tika import parser
from elasticsearch import Elasticsearch
配置ES连接
es = Elasticsearch("http://localhost:9200")
index_name = "archives_index"
初始化Tika
tika.initVM()
server_endpoint = 'http://localhost:9998'
def create_index():
"""创建索引并配置IK分词器"""
if es.indices.exists(index=index_name):
return
body = {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"file_name": {"type": "keyword"},
"file_path": {"type": "keyword"},
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
},
"create_time": {"type": "date"}
}
}
}
es.indices.create(index=index_name, body=body)
print(f"索引 {index_name} 创建成功")
def process_directory(directory):
"""遍历目录并索引文件"""
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".pdf") or file.endswith(".jpg") or file.endswith(".png"):
file_path = os.path.join(root, file)
index_file(file_path)
def index_file(file_path):
"""解析单个文件并写入ES"""
print(f"正在处理: {file_path}")
try:
调用Tika解析文本
parsed = parser.from_file(file_path, serverEndpoint=server_endpoint)
content = parsed.get("content", "")
if not content:
print(f"警告: {file_path} 未能提取到文本内容")
return
doc = {
"file_name": os.path.basename(file_path),
"file_path": file_path,
"content": content,
"create_time": os.path.getctime(file_path)
}
es.index(index=index_name, document=doc)
print(f"成功索引: {file_path}")
except Exception as e:
print(f"处理失败 {file_path}: {str(e)}")
if __name__ == "__main__":
修改此处为你的档案存储目录
target_dir = "/data/archives"
create_index()
if os.path.exists(target_dir):
process_directory(target_dir)
else:
print(f"目录 {target_dir} 不存在")
```
四、查询接口服务开发
使用Flask提供Web查询API。安装Flask:
```bash
pip install flask
```
新建文件search_service.py:
```python
from flask import Flask, request, jsonify
from elasticsearch import Elasticsearch
app = Flask(__name__)
es = Elasticsearch("http://localhost:9200")
index_name = "archives_index"
@app.route('/search', methods=['GET'])
def search():
keyword = request.args.get('q', '')
page = int(request.args.get('page', 1))
page_size = int(request.args.get('size', 10))
if not keyword:
return jsonify({"error": "请输入关键词"}), 400
构建查询DSL,支持高亮
query_body = {
"query": {
"multi_match": {
"query": keyword,
"fields": ["file_name", "content"],
"analyzer": "ik_smart"
}
},
"highlight": {
"pre_tags": ["
"],
"post_tags":": [""],
"fields": {
"content": {}
}
},
"from": (page - 1) page_size,
"size": page_size
}
try:
resp = es.search(index=index_name, body=query_body)
hits = resp['hits']['hits']
total = resp['hits']['total']['value']
results = []
for hit in hits:
source = hit['_source']
处理高亮片段,截取部分内容预览
highlight = hit.get('highlight', {}).get('content', [source['content'][:200]])[0]
results.append({
"file_name": source['file_name'],
"file_path": source['file_path'],
"snippet": highlight.replace("\n", " ") 去除换行符以便前端展示
})
return jsonify({
"total": total,
"data": results,
"page": page,
"size": page_size
})
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
```
五、前端查询页面实现
新建index.html,构建一个简洁的查询界面,直接对接Flask接口。
```html
事业单位档案查询系统
```
六、系统运行与验证
完成所有代码编写后,按照以下顺序启动系统。
1. 准备测试数据
在服务器创建一个目录存放测试PDF文件:
```bash
mkdir -p /data/archives
将几个测试PDF文件放入该目录
```
2. 启动索引流程
运行Python脚本将文件内容导入Elasticsearch:
```bash
python3 index_archives.py
```
观察终端输出,确认文件已成功索引。
3. 启动查询服务
```bash
python3 search_service.py
```
4. 访问前端页面
直接双击打开index.html,或者在浏览器中输入文件路径。在搜索框中输入测试PDF中的文字,点击查询。如果看到红色的关键词高亮和文件名列表,说明系统搭建成功。