我想使用条件匹配动态构建ElasticSearch Nest 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())
);
答案 0 :(得分:1)
有多种方法可以将各种调用集合到一个调用中,这将根据布尔输入返回不同的结果。
你有两个变量和4个不同的结果,你必须实现在某处检查所有这些的逻辑,所以你用SearchDescriptors构建if / elseif / else块,但是使用nest Filters这会变得稍微优雅一些(尽管仍然如此)类似)。如果需要进行更改并且比大型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排除了在运行查询之前未满足过滤要求的项目,这是需要注意的事项。
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);