Elasticsearch bool查询仍返回结果:排除英文书籍失败求助
解决Elasticsearch must_not排除查询不生效的问题
嘿,我一眼就看出问题所在啦!你的查询没生效,核心原因是字段类型和查询方式不匹配。
问题分析
你的taal字段是text类型,而term查询是精确匹配分词后的原始词条。默认情况下,text字段会被分词器处理(比如把英文单词转为小写),所以你文档里存储的"Engels"(首字母大写)会被分词成"engels",但你的term查询找的是"Engels",自然匹配不到,也就没法排除这些文档。
再看你的字段映射,taal下面有两个keyword类型的子字段:taal.keyword和taal.raw。keyword类型的字段不会被分词,会完整保留原始字符串的格式(包括大小写),正好适合做精确匹配。
修正后的查询语句
你只需要把查询的字段改成taal.keyword或者taal.raw就行,推荐用taal.keyword(更通用的命名):
GET books/_search { "query": { "bool": { "must_not": { "term": { "taal.keyword": "Engels" } } } } }
如果你想用taal.raw也是一样的效果:
GET books/_search { "query": { "bool": { "must_not": { "term": { "taal.raw": "Engels" } } } } }
额外补充
如果你的场景不需要严格区分大小写,也可以用match查询来匹配text字段(match会自动处理分词和大小写):
GET books/_search { "query": { "bool": { "must_not": { "match": { "taal": "Engels" } } } } }
不过对于精确排除特定值的场景,优先用term+keyword子字段的组合,效果更准确可控。
内容的提问来源于stack exchange,提问作者Elvira
相关产品推荐
相关产品推荐

