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

标签 elasticsearch nest

我想使用条件匹配来动态构建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/

相关文章:

elasticsearch - 使用范围elasticsearch一起查询“AND”和“OR”

c# - MongoDB-MongoRiver- Elasticsearch -NEST

elasticsearch - 将多个 bool 过滤器附加到 NEST 查询

elasticsearch - ElasticSearch.Net无法识别ElasticSearch返回的时间戳

elasticsearch - 在 ElasticSearch NEST 查询中返回原始 Json

json - Elasticsearch 批量 JSON 数据

elasticsearch - geo_ip kibana索引和logstash过滤器

elasticsearch - ElasticSearch查询模板/功能

tsql - ElasticSearch中的多字段通配符搜索

elasticsearch - 使用嵌套 Elasticsearch 客户端生成带有命名字段的 QueryString