我正在尝试将多个查询组合到一个布尔查询中,但生成的查询对于原始查询是空的。
这是我的方法调用
ConvertQueryToESD("{\"term\":\"fieldname\":\"value\"}"
,null
,a range filter)
.From(0)
.Take(50)
.SortMulti(a sort)
这是方法
internal SearchDescriptor<T> ConvertQueryToESD<T>(string queryString, string filterId, List<QueryContainer> filters) where T : class
{
var filterQueryString = GetFilter(filterId);
if (!string.IsNullOrWhiteSpace(filterQueryString))
{
var qd = new QueryDescriptor<T>();
filters.Add(qd.Raw(filterQueryString));
}
if (!string.IsNullOrWhiteSpace(queryString))
{
var qd = new QueryDescriptor<T>();
filters.Add(qd.Raw(queryString));
}
var sd = new SearchDescriptor<T>();
sd.Query(q => q.Bool(b => b.Must(filters.ToArray())));
return sd;
}
我的查询结果是
{
"from": 0,
"size": 50,
"sort": [
{
"startTimeLocal": {
"order": "desc"
}
}
],
"query": {
"bool": {
"must": [
{
"range": {
"startTimeLocal": {
"gte": "0001-01-01T00:00:00",
"lte": "2015-12-22T16:28:22"
}
}
},
{}
]
}
}
}
{}
是我希望看到原始术语查询的地方。为什么原始查询没有被序列化到SearchDescriptor中?我检查了SearchDescriptor,并在运行搜索之前填充了该字段。我还测试过只添加原始字符串术语查询而没有范围过滤器,搜索描述符序列化正确。
附录
private string GetFilter(string filterId)
{
if (string.IsNullOrWhiteSpace(filterId))
{
return null;
}
var response = _elasticClient.Get<FilterMapping>(filterId);
ThrowIfNotSuccessfull(response.ConnectionStatus);
return response.Source?.QueryString;
}