Elasticsearch 6.8:替换bio字段敏感词且不索引该字段可行吗?
当然可以实现!针对Elasticsearch 6.8的解决方案
作为ES 6.8的老玩家,你的需求完全能满足——核心思路是用**摄入管道(Ingest Pipeline)**提前替换敏感词,再通过映射(Mapping)禁用该字段的索引。下面是一步步的具体操作:
1. 创建敏感词替换的Ingest Pipeline
Ingest Pipeline是ES用来在文档写入前做预处理的工具,我们用它把bio里的敏感词替换成****。
执行以下命令创建管道(把(敏感词1|敏感词2|敏感词3)替换成你的实际敏感词列表,多个用|分隔,特殊字符记得转义,比如.要写成\.):
PUT _ingest/pipeline/censor_bio { "description": "替换bio字段中的敏感词", "processors": [ { "gsub": { "field": "bio", "pattern": "(敏感词1|敏感词2|敏感词3)", "replacement": "****" } } ] }
2. 配置User索引的Mapping,禁用bio字段的索引
接下来要确保bio字段不被索引,这样就无法通过bio的内容搜索到文档。创建索引时设置mapping:
PUT user_index { "mappings": { "_doc": { "properties": { "bio": { "type": "text", "index": false // 关键:禁用索引,该字段不会被用于搜索 }, // 其他字段按需配置,比如用户名、ID等 "username": { "type": "text" } } } } }
注意:ES 6.8还保留了索引类型(这里用
_doc),如果是已有索引,需要先关闭索引再修改mapping,不过建议新索引直接这么设置。
3. 应用Pipeline处理文档
有两种方式让文档经过我们的敏感词替换管道:
方式一:写入时手动指定Pipeline
每次写入文档时添加?pipeline=censor_bio参数:
PUT user_index/_doc/1?pipeline=censor_bio { "username": "张三", "bio": "我提到了敏感词1,还有敏感词2" }
方式二:设置索引默认Pipeline(更省心)
把管道设为索引的默认处理流程,之后所有写入的文档都会自动替换敏感词:
PUT user_index/_settings { "index.default_pipeline": "censor_bio" }
4. 验证效果
- 查看文档内容:执行
GET user_index/_doc/1,会返回替换后的bio:"bio": "我提到了****,还有****" - 验证索引禁用:执行搜索命令,尝试搜索敏感词,会返回0结果:
GET user_index/_search { "query": { "match": { "bio": "敏感词1" } } }
额外:处理已存在的旧文档
如果你的索引里已经有旧文档,需要批量更新替换敏感词,执行以下命令:
POST user_index/_update_by_query?pipeline=censor_bio
这条命令会遍历所有文档,应用我们的敏感词替换管道。
内容的提问来源于stack exchange,提问作者Aimn Blbol
相关产品推荐
相关产品推荐

