elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

C# 使用HasChild和query运算符创建嵌套查询

C# 使用HasChild和query运算符创建嵌套查询,c#,elasticsearch,nest,C#,elasticsearch,Nest,我在C#中使用NEST和ElasticSearch。我有一段现有代码,它采用QueryDescriptor类型,并返回BaseQuery 该方法的调用有点像这样: ... .Query( queryDescriptor => queryDescriptor .Filtered( filteredQueryDescriptor => filteredQueryDescriptor .Query(queryS

我在C#中使用NEST和ElasticSearch。我有一段现有代码,它采用QueryDescriptor类型,并返回BaseQuery

该方法的调用有点像这样:

...
.Query(
    queryDescriptor => queryDescriptor
        .Filtered(
            filteredQueryDescriptor => filteredQueryDescriptor
                .Query(queryString => searchParameters.SearchTree.ToElasticSearch(queryString))
                .Filter(filterDescriptor => searchParameters.SearchTree.ToElasticSearchFilter(filterDescriptor))
        )
)
...
方法“ToElasticSearch”看起来有点像以下内容:

...
public override BaseQuery ToElasticSearch(QueryDescriptor<DomainProfile> queryDescriptor)
{
    return queryDescriptor.DoSomething
}
...
。。。
公共重写BaseQuery到LasticSearch(QueryDescriptor QueryDescriptor)
{
返回queryDescriptor.DoSomething
}
...
现在在我的ToElasticSearch方法中。我想返回一个看起来有点像下面的BaseQuery

return queryDescriptor
.HasChild<ChildProfile>(
    child => child.Query(
        query => query.QueryString(
            queryStringDescriptor =>
                queryStringDescriptor.OnFieldsWithBoost(
                    boost => boost
                        .Add(profile => profile.Notes, 5)
                    )
                    .Query(QueryString.PrepareForSearch(SearchText))
                    .Operator(Operator.and)
                    .AutoGeneratePhraseQueries(true)
                    .PhraseSlop(0)
            )
        )
)
    ||
    queryDescriptor.QueryString(
        queryStringDescriptor =>
            queryStringDescriptor
                .OnFieldsWithBoost(
                    boost => boost
                        .Add(profile => profile.PersonalDetail.Email, 7)
                )
                .Query(QueryString.PrepareForSearch(SearchText))
                .Operator(Operator.and)
                .AutoGeneratePhraseQueries(true)
                .PhraseSlop(0)
        );
返回queryDescriptor
HasChild先生(
child=>child.Query(
query=>query.QueryString(
queryStringDescriptor=>
queryStringDescriptor.OnFieldsWithBoost(
boost=>boost
.Add(profile=>profile.Notes,5)
)
.Query(QueryString.PrepareForSearch(SearchText))
.操作员(操作员和)
.AutoGenerateFlaseQueries(真)
.用词slop(0)
)
)
)
||
queryDescriptor.QueryString(
queryStringDescriptor=>
查询字符串描述符
.onfielswithboost(
boost=>boost
.Add(profile=>profile.PersonalDetail.Email,7)
)
.Query(QueryString.PrepareForSearch(SearchText))
.操作员(操作员和)
.AutoGenerateFlaseQueries(真)
.用词slop(0)
);
如果它看起来很凌乱,那是因为它很凌乱。很明显,这个或部分是不对的。我这样做只是为了让事情继续下去(或者它会起作用吗?我认为增压部分根本不会起作用,但请随意告诉我这一点)


似乎给定了一个QueryDescriptor,我无法同时查询主搜索对象和同一查询中的子对象。这似乎是一个或两个查询都返回一个BaseQuery,如果您愿意,我不确定如何“附加”

您可以使用
| |
完全或两个或多个这样的查询。你还有什么问题吗?嗨,Martijn。是的。这确实有效,但以我为例。并将Notes上的boost设置为999,电子邮件上的boost设置为1。检查返回的订单结果。然后反向推进,使Email有999,Notes有1。结果的顺序是一样的。它似乎将boost应用于每个查询,然后在最后一步将它们合并在一起。