C# 使用HasChild和query运算符创建嵌套查询
我在C#中使用NEST和ElasticSearch。我有一段现有代码,它采用QueryDescriptor类型,并返回BaseQuery 该方法的调用有点像这样:C# 使用HasChild和query运算符创建嵌套查询,c#,
elasticsearch,nest,C#,
elasticsearch,Nest,我在C#中使用NEST和ElasticSearch。我有一段现有代码,它采用QueryDescriptor类型,并返回BaseQuery 该方法的调用有点像这样: ... .Query( queryDescriptor => queryDescriptor .Filtered( filteredQueryDescriptor => filteredQueryDescriptor .Query(queryS
...
.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应用于每个查询,然后在最后一步将它们合并在一起。