Elasticsearch Nest - 具有多个过滤器的简单查询

时间:2015-08-27 14:32:05

标签: c# elasticsearch nest

我正在尝试在我想要的地方进行简单的查询:

select * from POC where Account_No = [accountno] and BUSINESS_UNIT = [business_unit] 
下面是我没有运气的东西。有什么想法吗?

var filters = new List<FilterContainer>();

filters.Add(new FilterDescriptor<poc>().Bool(b => b.Must(m => m.Term(i => i.Account_No, txtAccount.Text))));
filters.Add(new FilterDescriptor<poc>().Bool(b => b.Must(m => m.Term(i => i.BUSINESS_UNIT, txtBU.Text))));

var searchDescriptor = new SearchDescriptor<poc>();
// Filter with AND operator
searchDescriptor.Filter(f => f.And(filters.ToArray()));

var r = client.Search<poc>(searchDescriptor);

更新

第二个过滤器似乎不起作用。 当我运行这个时,我得不到任何我不确定的记录。当我查看帐户查询

时,我会在运行记录时看到它
{
  "query": {
    "term": {
      "BUSINESS_UNIT": "CSPCN"
    }
  }
}

2 个答案:

答案 0 :(得分:3)

这应该做你想要的:

FilterContainer filter = null;

filter &= Filter<poc>.Term(i => i.Account_No, txtAccount.Text);
filter &= Filter<poc>.Term(i => i.BUSINESS_UNIT, txtBU.Text);

var r = client.Search<poc>(sd => sd.Filter(f => filter));

答案 1 :(得分:0)

我将过滤器更改为使用Match而不是Term,它似乎有效。

我不确定为什么会出现这种情况,但是当我使用Term使用Business_Unit进行搜索时,即使是单独使用,也不会返回任何结果。

var filters = new List<FilterContainer>();

filters.Add(new FilterDescriptor<poc>().Bool(b => b.Must(m => m.Query(q => q.Wildcard(z => z.Account_No, txtAccount.Text + "*")))));
filters.Add(new FilterDescriptor<poc>().Bool(b => b.Must(m => m.Query(q => q.Match(mat => mat.OnField(z => z.BUSINESS_UNIT).Query(txtBU.Text))))));

var searchDescriptor = new SearchDescriptor<poc>();
// Filter with AND operator
searchDescriptor.Filter(f => f.And(filters.ToArray()));

var r = client.Search<poc>(searchDescriptor);

<强>更新

我能够使用匹配,但我只需要将值设为小写,这就解释了为什么它没有返回任何结果。

{
  "query": {
    "term": {
      "BUSINESS_UNIT": "cspcn"
    }
  }
}