gpt4 book ai didi

c# - "Dynamically"在 NEST 中创建过滤器

转载 作者:太空狗 更新时间:2023-10-29 22:33:14 24 4
gpt4 key购买 nike

我有一个有趣的挑战,我认为有一个简单的答案。

我知道当您在句法上执行如下操作时,NEST 过滤器可以正常工作:

var andFilter = FilterFactory.AndFilter(
FilterFactory.TermFilter("name.first", "shay1"),
FilterFactory.TermFilter("name.first", "shay4")
);

我的基本服务应该允许调用者传入某种可枚举的项目列表以进行过滤。

我基本上希望能够以编程方式实现这样的事情(过滤器被传递到方法中):

var andFilter = new FilterDescriptor();
foreach (var filter in filters)
{
andFilter = filter concatenated to andFilter
}

换句话说,如果我传入一个数组 {{"first.name", "joe"}, {"first.name", "jim"}, {"first.name", "frank"}}我想产生相当于

var andFilter = FilterFactory.AndFilter(
FilterFactory.TermFilter("name.first", "joe"),
FilterFactory.TermFilter("name.first", "joe"),
FilterFactory.TermFilter("name.first", "frank")
);

最佳答案

使用基于 lambda 的 DSL,您可以执行以下操作:

var termsFilters = from tp in termParameters
let field = ToCamelCaseNestedNames(tp.SearchField)
let terms = tp.SearchValues
select Filter.Terms(field, terms);

var prefixFilters = from tp in prefixParameters
let field = ToCamelCaseNestedNames(tp.SearchField)
let prefix = tp.SearchValues.FirstOrDefault().ToLowerInvariant()
select Filter.Prefix(field, prefix);

var search = client.Search(s => s
.From(0)
.Size(20)
.Filter(f => f.And(termsFilters.Concat(prefixFilters).ToArray()))
);

我觉得读起来更好:)

Nest 现在还支持 conditionless查询所以如果有tp.SearchValuesnull , emptyall empty stringstp.SearchFieldnull or empty它将跳过该术语/前缀查询。

不过,您可以轻松地恢复此行为:

var search = client.Search(s => s
.Strict()
.From(0)
.Size(20)
.Filter(f => f.And(termsFilters.Concat(prefixFilters).ToArray()))
);

这将抛出 DslException如果生成空查询。

最后一点 client.Search()将返回 QueryResult<dynamic>如果您可以强类型化您的文档,那么可以执行 client.Search<MyDocument>() .

关于c# - "Dynamically"在 NEST 中创建过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13433981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com