具有动态匹配的{ElasticSearch Nest查询

时间:2015-06-11 18:47:29

标签: elasticsearch nest

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

1 个答案:

答案 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);