如何在Elasticsearch 7.17.9中集成PersianStemmer实现自定义词干提取
将Python PersianStemmer应用于Elasticsearch 7.17.9的波斯语文本词干提取
针对你的需求,有两种实用方案,从易到难适配不同场景:
方案一:数据导入前用Python预处理(新手友好)
直接在数据写入Elasticsearch前,用PersianStemmer处理文本,将原文本和词干结果一起存入索引,操作最简单:
- 安装PersianStemmer库
pip install PersianStemmer
- 编写Python导入脚本,集成词干提取逻辑
from elasticsearch import Elasticsearch from PersianStemmer import PersianStemmer # 连接Ubuntu服务器上的Elasticsearch es = Elasticsearch(["http://localhost:9200"]) # 初始化波斯语词干提取器 stemmer = PersianStemmer() # 示例:处理单条文本并写入ES original_text = "این یک متن فارسی برای تست است" stemmed_text = stemmer.run(original_text) # 构建文档,同时保存原文本和词干结果 doc = { "original_text": original_text, "stemmed_text": stemmed_text } # 写入指定索引 es.index(index="persian_docs", document=doc)
- 搜索时直接针对
stemmed_text字段查询,即可实现基于词干的匹配。
方案二:用Ingest Pipeline自动处理(生产环境适配)
通过Elasticsearch的Ingest Pipeline结合外部Python脚本,实现数据导入时自动完成词干提取,无需修改导入代码:
- 安装PersianStemmer并准备处理脚本
pip install PersianStemmer
创建脚本文件/opt/es_scripts/persian_stem.py,内容如下:
#!/usr/bin/env python3 import sys import json from PersianStemmer import PersianStemmer stemmer = PersianStemmer() # 读取Elasticsearch传入的JSON数据 input_data = json.load(sys.stdin) raw_text = input_data.get("original_text", "") # 执行词干提取 stemmed_result = stemmer.run(raw_text) # 返回处理后的结果 json.dump({"stemmed_text": stemmed_result}, sys.stdout)
给脚本添加执行权限:
chmod +x /opt/es_scripts/persian_stem.py
- 创建Ingest Pipeline
curl -X PUT "http://localhost:9200/_ingest/pipeline/persian_stem_pipeline" -H "Content-Type: application/json" -d' { "description": "自动处理波斯语文本词干", "processors": [ { "exec": { "command": "/usr/bin/python3 /opt/es_scripts/persian_stem.py", "field": "original_text", "target_field": "stemmed_text", "shell": true } } ] } '
- 创建索引并绑定默认Pipeline
curl -X PUT "http://localhost:9200/persian_docs" -H "Content-Type: application/json" -d' { "settings": { "index.default_pipeline": "persian_stem_pipeline" }, "mappings": { "properties": { "original_text": {"type": "text"}, "stemmed_text": {"type": "text"} } } } '
- 正常导入数据即可,Elasticsearch会自动生成词干字段
from elasticsearch import Elasticsearch es = Elasticsearch(["http://localhost:9200"]) # 只需传入原文本,Pipeline会自动处理 doc = { "original_text": "این یک متن فارسی برای تست است" } es.index(index="persian_docs", document=doc)
注意事项
- 确保Elasticsearch进程拥有读取和执行Python脚本的权限
- 用
which python3确认系统中的Python路径,替换脚本和Pipeline中的路径 - 若处理海量数据,方案一的预处理方式性能更优;方案二适合需要实时自动处理的场景
内容的提问来源于stack exchange,提问作者miladjurablu
相关产品推荐
相关产品推荐

