从elastic中排除(不包含)某些值的查询

本文关键字:查询 包含 elastic 排除 | 更新日期: 2023-09-27 18:09:34

我使用NEST查询从弹性过滤记录。

下面的查询将根据articleIds列表过滤记录。

QueryContainer nestedQuery = null;
nestedQuery &= Query<PublishedArticle>.Terms(qs => qs
               .Field(f => f.AssignedArticleList.FirstOrDefault().AssignedArticleId)
                  .Terms(articleIds)
              );

但是现在我想要获取不包含prop articleIds值的记录。我该如何做到这一点?检查must_not条款弹性文件。我如何构建这个查询?

articleIds基本上是一个整数列表。

感谢任何帮助!:)

从elastic中排除(不包含)某些值的查询

您需要一个带有must_not子句的bool查询

var articleIds = new[] { 1, 2, 3, 4 };
client.Search<PublishedArticle>(s => s
    .Query(q => q
        .Bool(b => b
            .MustNot(mn => mn
                .Terms(t => t
                    .Field(f => f.AssignedArticleList.FirstOrDefault().AssignedArticleId)
                    .Terms(articleIds)
                )
            )
        )
    )
);

使用!操作符,可以在NEST中使用操作符重载

来缩短must_not
client.Search<PublishedArticle>(s => s
    .Query(q => !q
        .Terms(t => t
            .Field(f => f.AssignedArticleList.FirstOrDefault().AssignedArticleId)
            .Terms(articleIds)
        )
    )
);

都生产

{
  "query": {
    "bool": {
      "must_not": [
        {
          "terms": {
            "assignedArticleList.assignedArticleId": [
              1,
              2,
              3,
              4
            ]
          }
        }
      ]
    }
  }
}