2016-09-30 85 views
1

我正在使用NEST查询从弹性筛选记录。查询从弹性排除(不包含)某些值

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

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

但现在我想获取不包含在道具articleIds值的记录。我如何实现这一目标?正在检查must_not条款上的弹性documents。我如何构建这个查询?

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

任何帮助表示赞赏! :)

回答

2

你需要一个bool查询与must_not条款

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) 
       ) 
      ) 
     ) 
    ) 
); 

使用!运营商,must_not可以在NEST使用运算符重载

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 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 
+0

谢谢。工作非常好! :)是否有任何教程引用其他弹性文档中提到的内容? – Raghavendra

+1

有客户文档 - https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/index.html,我们正在进一步扩展以包含分析的其他部分,索引,渗透等,以及更好地组织那里的部分。 –