我有一个dynamic
搜索描述符生成器。其中一个步骤是遍历范围过滤器列表并将其添加到搜索描述符中。但是,我添加的任何范围查询都会覆盖以前的范围查询。如何将范围查询追加到已添加的范围查询列表中
public SearchDescriptor<dynamic> FilterSearch(SearchDescriptor<dynamic> searchDescriptor, List<FilterField> filters)
{
foreach (var filter in filters)
{
searchDescriptor = AddFilterToSearch(searchDescriptor, filter);
}
return searchDescriptor;
}
private static SearchDescriptor<dynamic> AddFilterToSearch(SearchDescriptor<dynamic> searchDescriptor, FilterField filter)
{
var range = new RangeQuery
{
Field = filter.Field
};
var term = new TermQuery
{
Field = filter.Field
};
string rangeValue = filter.Value == null ? null : JsonConvert.ToString(filter.Value);
// trim the quotes that JsonConvert wraps around the value for some reason
if (rangeValue != null && rangeValue.StartsWith("\"") && rangeValue.EndsWith("\""))
rangeValue = rangeValue.Substring(1, rangeValue.Length - 2);
switch (filter.Operator)
{
case Enums.ComparrisonOperator.LowerThan:
range.LowerThan = rangeValue;
break;
case Enums.ComparrisonOperator.LowerThanOrEqualTo:
range.LowerThanOrEqualTo = rangeValue;
break;
case Enums.ComparrisonOperator.Equals:
if (filter.Value != null && filter.Value is string)
filter.Value = filter.Value.ToString().ToLowerInvariant();
term.Value = filter.Value;
break;
case Enums.ComparrisonOperator.GreaterThan:
range.GreaterThan = rangeValue;
break;
case Enums.ComparrisonOperator.GreaterThanOrEqualTo:
range.GreaterThanOrEqualTo = rangeValue;
break;
}
switch (filter.Operator)
{
case Enums.ComparrisonOperator.LowerThan:
case Enums.ComparrisonOperator.LowerThanOrEqualTo:
case Enums.ComparrisonOperator.GreaterThan:
case Enums.ComparrisonOperator.GreaterThanOrEqualTo:
searchDescriptor = searchDescriptor.Query(range);
break;
case Enums.ComparrisonOperator.Equals:
searchDescriptor = searchDescriptor.Query(term);
break;
}
return searchDescriptor;
}
2条答案
按热度按时间zvms9eto1#
如果你正在使用NEST,我认为你应该使用QueryContainer。
或者类似的东西....希望它能有所帮助!当然...这是针对Elasticsearch〈2.0的
5w9g7ksd2#
您可以使用QueryContainer添加它,如下所示