ElasticSearch 5.1精确匹配删除文档脚本修复咨询
解决Elasticsearch _delete_by_query误删前缀内容的问题
我来帮你搞定这个误删的问题!你现在遇到的情况是因为component.name字段如果是text类型的话,term查询并不会做你期望的精确匹配——它会匹配分词后的单个词汇,所以带相同前缀的文档只要包含共同的分词(比如"prefix"、"component")就会被误删。
要实现同时满足两个条件的精确删除,有两种可靠的方案,你可以根据自己的字段映射来选择:
方案1:使用keyword子字段做精确匹配
如果你的component.name字段有对应的keyword子字段(Elasticsearch默认会给text类型字段生成字段名.keyword的keyword子字段,用于精确匹配),直接用这个子字段执行term查询即可,因为keyword类型不会对内容分词,完全匹配字段的原始值。
修改后的删除命令:
curl -X POST elasticDomain/index/_delete_by_query -d '{ "query": { "bool": { "must": [ { "term": { "component.name.keyword": { "query": "prefix-component-one" } } }, { "term": { "enviroment": "qa" } } ] } } }'
方案2:使用match_phrase做短语精确匹配
如果没有keyword子字段,或者不想依赖子字段,可以用match_phrase查询,它会匹配整个短语内容,确保只有完全匹配"prefix-component-one"的文档才会被命中。
对应的删除命令:
curl -X POST elasticDomain/index/_delete_by_query -d '{ "query": { "bool": { "must": [ { "match_phrase": { "component.name": "prefix-component-one" } }, { "term": { "enviroment": "qa" } } ] } } }'
重要提醒:先测试再删除
为了避免再次误删,建议先执行查询命令,确认返回的结果正好是你想要删除的文档:
curl -X GET elasticDomain/index/_search -d '{ "query": { "bool": { "must": [ { "term": { "component.name.keyword": "prefix-component-one" } }, { "term": { "enviroment": "qa" } } ] } } }'
内容的提问来源于stack exchange,提问作者Jorge Tovar
相关产品推荐
相关产品推荐

