如何在Elasticsearch NEST查询中排除含指定URL的文档?
解决NEST查询中排除包含指定内容URL的问题
你现在的查询里用!q.Terms来排除URL的方式是精确匹配,但你的需求是排除URL包含ideaArticles列表中任意内容的文档,所以得换个更合适的写法。咱们用Elasticsearch的bool查询来组合条件,把排除逻辑放到must_not里,结合通配符匹配来实现“包含”的过滤:
var result = ElasticSearchClientConnection.Client.Search<T>(s => s .Query(q => q .Bool(b => b // 保留你原来的两个过滤条件 .Must( must => must.Match(p => p.Field(f => f.Body).Query(phrase)), must => must.Terms(p => p.Field(f => f.SourceId).Terms(sourceIds)) ) // 排除URL包含ideaArticles中任意内容的文档 .MustNot(mustNot => ideaArticles.Select(article => mustNot.Wildcard(w => w.Field(f => f.URL).Value($"*{article}*")) ).ToArray() ) ) ) .Take(take) );
关键点说明:
- 用
Bool查询来拆分条件,逻辑更清晰,也能灵活组合“必须满足”和“必须排除”的规则 Must块里保留你原本的两个核心过滤条件:Body匹配指定短语、SourceId在给定列表中MustNot块遍历ideaArticles列表,为每个条目创建一个WildcardQuery——*通配符表示匹配任意前缀/后缀,这样就能捕获所有URL包含该条目的文档,进而排除它们
如果你的URL字段在Elasticsearch中是被分词存储的(一般不建议对URL分词,但如果是这种情况),可以指定匹配其keyword子字段来确保是对完整URL字符串进行匹配:
.Wildcard(w => w.Field(f => f.URL.Suffix("keyword")).Value($"*{article}*"))
这样就能精准排除所有URL包含ideaArticles列表中内容的记录了。
内容的提问来源于stack exchange,提问作者Fereshteh Rabet
相关产品推荐
相关产品推荐

