ElasticSearch日期范围查询入参为null是否会导致查询异常?
结论
你当前的写法在search.From和search.To都为null时不会报错,但会返回空查询结果,而非自动忽略日期过滤条件。
原因
你使用的是.NET生态下的Elasticsearch官方客户端NEST,它的查询子句处理规则如下:
- 只有完全没有有效约束的查询子句才会被自动判定为无效应子句,在最终生成的DSL中剔除
- 你当前的写法已经显式指定了
DateRange的关联字段为CreatedTimeStamp,只是上下界参数为null,最终生成的查询DSL会包含空的range条件,示例如下:
{ "query": { "bool": { "must": [ { "query_string": { "query": "你的搜索词" } }, { "range": { "CreatedTimeStamp": {} } } ] } } }
Elasticsearch在处理空range条件时,会判定该条件没有任何匹配值,最终整个查询返回空结果。
正确实现方式
你可以通过条件判断动态拼接查询,只有当From或To存在有效值时才添加日期过滤条件,示例代码如下:
var searchResponse = client.Search<mdl.Event>(s => s .Query(q => // 固定的搜索词条件 q.QueryString(qs => qs.Query(search.Space)) // 动态拼接日期过滤条件:两个参数都为空时返回MatchAll(不影响原有查询) && (search.From.HasValue || search.To.HasValue ? q.DateRange(r => { var range = r.Field(f => f.CreatedTimeStamp); if (search.From.HasValue) range = range.GreaterThanOrEquals(search.From); if (search.To.HasValue) range = range.LessThanOrEquals(search.To); return range; }) : q.MatchAll()) ));
内容的提问来源于stack exchange,提问作者Benjamin Salerno
相关产品推荐
相关产品推荐

