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

Query to exclude (doesn't contain) certain values from elastic

我正在使用 NEST 查询从 elastic 中过滤记录。

以下查询将根据 articleIds 列表过滤记录。它工作正常。

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

但现在我想获取不包含属性 articleIds 中的值的记录。我如何实现这一目标?正在检查 must_not 子句上的弹性 documents。如何构建此查询?

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

感谢任何帮助! :)

您需要一个带有 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
            ]
          }
        }
      ]
    }
  }
}