elasticsearch 具有动态匹配的ElasticSearch嵌套查询,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch 具有动态匹配的ElasticSearch嵌套查询,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch 具有动态匹配的ElasticSearch嵌套查询

elasticsearch 具有动态匹配的ElasticSearch嵌套查询,elasticsearch,nest,elasticsearch,Nest,我想使用条件匹配动态构建ElasticSearch嵌套SearchDescriptor。UI有两个复选框“排除电子邮件”和“排除松散文件”。如果两者都选中,搜索结果将匹配0个点击 这4个查询可以工作,但我不知道如何根据条件使匹配部分成为动态的(除了对每个排列的UI复选框使用“if-elseif-else”语句) 谢谢你的建议 var searchDescriptor = new SearchDescriptor<MyDocument>()

我想使用条件匹配动态构建ElasticSearch嵌套SearchDescriptor。UI有两个复选框“排除电子邮件”和“排除松散文件”。如果两者都选中,搜索结果将匹配0个点击

这4个查询可以工作,但我不知道如何根据条件使匹配部分成为动态的(除了对每个排列的UI复选框使用“if-elseif-else”语句)

谢谢你的建议

                var searchDescriptor = new SearchDescriptor<MyDocument>()
                        .Query(q => q
                            .Match(m => m.OnField(p => p.isemail).Query("true"))
                            && q.Match(m => m.OnField(p => p.isemail).Query("false"))
                            && q.QueryString(p => p.Query(searchParameters.query).DefaultOperator(Operator.And))
                            && q.Term(p => p.Author, searchParameters.author == null ? null : searchParameters.author.ToLower())
                        );

                var searchDescriptor = new SearchDescriptor<MyDocument>()
                        .Query(q => q
                            .Match(m => m.OnField(p => p.isemail).Query("true"))
                            && q.QueryString(p => p.Query(searchParameters.query).DefaultOperator(Operator.And))
                            && q.Term(p => p.Author, searchParameters.author == null ? null : searchParameters.author.ToLower())
                        );

                var searchDescriptor = new SearchDescriptor<MyDocument>()
                        .Query(q => q
                            .Match(m => m.OnField(p => p.isemail).Query("false"))
                            && q.QueryString(p => p.Query(searchParameters.query).DefaultOperator(Operator.And))
                            && q.Term(p => p.Author, searchParameters.author == null ? null : searchParameters.author.ToLower())
                        );

                var searchDescriptor = new SearchDescriptor<MyDocument>()
                        .Query(q => q
                            .QueryString(p => p.Query(searchParameters.query).DefaultOperator(Operator.And))
                            && q.Term(p => p.Author, searchParameters.author == null ? null : searchParameters.author.ToLower())
                        );
var searchDescriptor=新的searchDescriptor()
.Query(q=>q
.Match(m=>m.OnField(p=>p.isemail).Query(“true”))
&&q.Match(m=>m.OnField(p=>p.isemail).Query(“false”))
&&q.QueryString(p=>p.Query(searchParameters.Query).DefaultOperator(Operator.And))
&&q.Term(p=>p.Author,searchParameters.Author==null?null:searchParameters.Author.ToLower())
);
var searchDescriptor=新的searchDescriptor()
.Query(q=>q
.Match(m=>m.OnField(p=>p.isemail).Query(“true”))
&&q.QueryString(p=>p.Query(searchParameters.Query).DefaultOperator(Operator.And))
&&q.Term(p=>p.Author,searchParameters.Author==null?null:searchParameters.Author.ToLower())
);
var searchDescriptor=新的searchDescriptor()
.Query(q=>q
.Match(m=>m.OnField(p=>p.isemail).Query(“false”))
&&q.QueryString(p=>p.Query(searchParameters.Query).DefaultOperator(Operator.And))
&&q.Term(p=>p.Author,searchParameters.Author==null?null:searchParameters.Author.ToLower())
);
var searchDescriptor=新的searchDescriptor()
.Query(q=>q
.QueryString(p=>p.Query(searchParameters.Query).DefaultOperator(Operator.And))
&&q.Term(p=>p.Author,searchParameters.Author==null?null:searchParameters.Author.ToLower())
);

有多种方法可以将各种调用合并为一个调用,根据布尔输入返回不同的结果

您有2个变量和4个不同的结果,您必须在某处实现检查所有这些的逻辑,因此您必须使用SearchDescriptor构建if/elseif/else块,但是使用嵌套过滤器,这会变得稍微优雅一些(尽管仍然相似)。如果需要更改,下面的过滤器将更容易修改,并且比较大的if/else块更可读

Func<FilterDescriptor<T>, FilterContainer> filterName = null;

if (foo && bar) { 

filterName = af => af.Query(
    q => q.Match(m => m.OnField(p => p.isemail).Query("true")) && 
    q.Match(m => m.OnField(p => p.isemail).Query("false"))
)}

if (foo) {
filterName = af => af.Query(
    q => q.Match(m => m.OnField(p => p.isemail).Query("true"))
)}

if (bar) {
filterName = af => af.Query(
    q => q.Match(m => m.OnField(p => p.isemail).Query("false"))
)}

//Any Filter that will always return true, so Filter != null
else {filterName = af => af.Exists("id");}
Func filterName=null;
如果(foo&bar){
filterName=af=>af.Query(
q=>q.Match(m=>m.OnField(p=>p.isemail).Query(“true”)&&
q、 匹配(m=>m.OnField(p=>p.isemail.Query(“false”))
)}
如果(foo){
filterName=af=>af.Query(
q=>q.Match(m=>m.OnField(p=>p.isemail.Query(“true”))
)}
如果(巴){
filterName=af=>af.Query(
q=>q.Match(m=>m.OnField(p=>p.isemail.Query(“false”))
)}
//任何将始终返回true的筛选器,因此筛选器!=无效的
else{filterName=af=>af.Exists(“id”);}
使用过滤器创建搜索描述符。只有同时满足过滤器要求的结果才会返回。Elasticsearch排除在运行查询之前未满足筛选要求的项目,这是需要记住的

var searchDescriptor = new SearchDescriptor<MyDocument>()
    .Query(q => q
        .QueryString(p => p.Query(searchParameters.query).DefaultOperator(Operator.And))
        && q.Term(p => p.Author, searchParameters.author == null ? null : searchParameters.author.ToLower())
    ).Filter(filterName);
var searchDescriptor=新的searchDescriptor()
.Query(q=>q
.QueryString(p=>p.Query(searchParameters.Query).DefaultOperator(Operator.And))
&&q.Term(p=>p.Author,searchParameters.Author==null?null:searchParameters.Author.ToLower())
).过滤器(过滤器名称);

谢谢。真是太棒了!我有点不明白为什么要用这个东西:Func,但我不需要理解它,它才能工作。没问题,我对类型混乱表示歉意,在我自己的项目中使用该类型太长时间的肌肉记忆。编辑了这篇文章。