使用AWS OpenSearch/ElasticSearch Search API如何排除指定文档?
在OpenSearch/ElasticSearch中搜索时排除特定文档的方法
完全不需要先搜索再手动过滤,直接通过bool查询就能在搜索阶段完成排除操作,具体实现方式如下:
方法一:使用terms精确排除(推荐)
如果你的name字段是text类型,通常会自动生成对应的keyword子字段(用于精确匹配完整字符串),可以用terms在must_not中指定要排除的电影名称:
GET /movies/_search { "query": { "bool": { "must": [ { "match": { "name": "Night" } } ], "must_not": [ { "terms": { "name.keyword": ["Boogie Nights", "Aladdin"] } } ] } } }
这里的逻辑很清晰:
must中的match保证只返回名称包含“Night”的电影must_not中的terms直接排除名称精确匹配“Boogie Nights”和“Aladdin”的文档
方法二:使用match_phrase精确排除
如果你的索引没有name.keyword子字段,也可以用match_phrase来精确匹配完整电影名称,逐个排除:
GET /movies/_search { "query": { "bool": { "must": [ { "match": { "name": "Night" } } ], "must_not": [ { "match_phrase": { "name": "Boogie Nights" } }, { "match_phrase": { "name": "Aladdin" } } ] } } }
以上两种方式都会让ElasticSearch/OpenSearch在查询阶段直接过滤掉不需要的文档,返回的结果就是已经排除指定电影后的匹配结果,无需后续手动处理。
内容的提问来源于stack exchange,提问作者Josh Gafni
相关产品推荐
相关产品推荐

