You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Elasticsearch 7.17.9中集成PersianStemmer实现自定义词干提取

将Python PersianStemmer应用于Elasticsearch 7.17.9的波斯语文本词干提取

针对你的需求,有两种实用方案,从易到难适配不同场景:

方案一:数据导入前用Python预处理(新手友好)

直接在数据写入Elasticsearch前,用PersianStemmer处理文本,将原文本和词干结果一起存入索引,操作最简单:

  1. 安装PersianStemmer库
pip install PersianStemmer
  1. 编写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)
  1. 搜索时直接针对stemmed_text字段查询,即可实现基于词干的匹配。

方案二:用Ingest Pipeline自动处理(生产环境适配)

通过Elasticsearch的Ingest Pipeline结合外部Python脚本,实现数据导入时自动完成词干提取,无需修改导入代码:

  1. 安装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
  1. 创建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
      }
    }
  ]
}
'
  1. 创建索引并绑定默认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"}
    }
  }
}
'
  1. 正常导入数据即可,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:03:27