我正在使用NEST来查询ElasticSearch,我正在寻找创建一个条件过滤器。我需要查询匹配类别和可选的标题和章节字段。我正在做一个聚合来获得独特的价值观。问题是过滤器似乎在过滤器字段上执行了OR。我在这个例子中做错了什么想法?
FilterContainer filter = new FilterContainer();
filter = Filter<Page>.Term("category", "1575");
if (title != null)
{
filter &= Filter<Page>.Term("title", title);
}
if (chapter != null)
{
filter &= Filter<Page>.Term("chapter", chapter);
}
var result = client.Search<Page>(s => s
.Index(index)
.Filter(filter)
.Size(0)
.Aggregations(a => a
.Terms("my_agg", st => st
.Field("title")
)
)
);
var myAgg = result.Aggs.Terms("my_agg");
IList<KeyItem> lst = myAgg.Items;
return lst;
答案 0 :(得分:4)
这将为您提供所有行的结果,因为您的过滤器根本不会用于聚合。因此看起来过滤器正在进行OR运算。根据您的要求,您需要使用在聚合内指定过滤器的过滤器聚合。有关详细信息,请查看http://www.elasticsearch.org/guide/en/elasticsearch/reference/master/search-aggregations-bucket-filter-aggregation.html。
出于您的目的,以下是用于创建搜索请求和处理响应的更新代码。
var result = client.Search<Page>(s => s
.Index(index)
.Size(0)
.Aggregations(fa => fa
.Filter("filtered_aggs", f => f
.Filter(fd => filter)
.Aggregations(ta => ta
.Terms("my_agg", st => st
.Field("title")
)
)
)
)
)
);
var myAgg = result.Aggs.Nested("filtered_aggs").Terms("my_agg");
IList<KeyItem> lst = myAgg.Items;
return lst;