我想使用条件匹配来动态构建ElasticSearch Nest SearchDescriptor。 UI具有两个复选框“排除电子邮件”和“排除松散文件”。如果两者都选中,则搜索结果将匹配0个匹配项。
这4个查询有效,但是我无法弄清楚如何根据条件使Match部件动态化(仅针对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())
);
最佳答案
有多种方法可以将各种调用组合到一个调用中,根据 bool(boolean) 输入,该调用将返回不同的结果。
您有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");}
使用过滤器创建搜索描述符。只有满足过滤条件的结果才会返回。 Elasticsearch在运行查询的之前排除不满足filter要求的项目,这是要记住的。
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);
关于elasticsearch - 具有动态匹配的ElasticSearch嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30789008/