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

本文关键字:过滤器 简单 查询 Nest -具 Elasticsearch | 更新日期: 2023-09-27 18:10:02

我想做一个简单的查询,我想:

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"
    }
  }
}

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

这应该是你想要的:

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

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

我不知道为什么会出现这种情况,但是当我使用Business_Unit使用Term进行搜索时,即使是它本身,也不会返回任何结果。

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

我可以使用match,但我必须使值小写,这解释了为什么它不返回任何结果。

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