ElasticSearch:根据条件组合多个Match查询

问题描述 投票:0回答:1

开始编写 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。

.net elasticsearch
1个回答
0
投票

首先,我要感谢您的提问。没有您的代码,我无法回答我自己的类似问题。其次,您的结果集包含所有内容的原因是因为

must
列表在将其转换为
null
时计算结果为
ICollection<Query>
。 这里的修复方法是将
must
实例化为
Query
类型的集合,首先:

ICollection<Query>? must = new List<Query>();

然后按照您目前正在做的方式进行操作。

简单解释一下:

must
集合属于
Query
类型,但它会很乐意接受
MatchQuery
类型对象。对于
MatchQuery
类来说,这是奇怪的行为,因为它不是从
Query
类继承的。它起作用的原因是因为在
MatchQuery
类的背后存在一个隐式运算符,本质上将
MatchQuery
映射到
Query
类型。

一些有用的链接:

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/user-defined-conversion-operators

https://medium.com/@gustavorestani/c-implicit-and-explicit-operators-a-compressive-guide-5e6972cc8671

© www.soinside.com 2019 - 2024. All rights reserved.