开始编写 QueryBuilder 来构建对 ElasticSearch 的查询。 我希望“必须”子句结合多个条件,但它应该只包含我想要应用的条件。我应该使用对象初始值设定项,以便可以保存它以供将来重用。 这是代码:
public class QueryBuilder
{
public Query BuildQuery(string firstName, string lastName)
{
var must = new List<MatchQuery>();
if (!string.IsNullOrWhiteSpace(firstName))
{
must.Add(new MatchQuery("firstName") { Query = firstName });
}
if (!string.IsNullOrWhiteSpace(lastName))
{
must.Add(new MatchQuery("lastName") { Query = lastName });
}
return new BoolQuery
{
Must = must as ICollection<Query>
};
}
}
但是使用此查询运行 SearchRequest 会返回所有项目,而不仅仅是那些等于“firstName”和“lastName”的项目。 我使用:Elastic.Clients.Elasticsearch 8.9.2 并且不使用 Nest。
首先,我要感谢您的提问。没有您的代码,我无法回答我自己的类似问题。其次,您的结果集包含所有内容的原因是因为
must
列表在将其转换为 null
时计算结果为 ICollection<Query>
。
这里的修复方法是将 must
实例化为 Query
类型的集合,首先:
ICollection<Query>? must = new List<Query>();
然后按照您目前正在做的方式进行操作。
简单解释一下:
must
集合属于 Query
类型,但它会很乐意接受 MatchQuery
类型对象。对于 MatchQuery
类来说,这是奇怪的行为,因为它不是从 Query
类继承的。它起作用的原因是因为在 MatchQuery
类的背后存在一个隐式运算符,本质上将 MatchQuery
映射到 Query
类型。
一些有用的链接: