C#中,Elasticsearch.Net判断空字符串

之前有个业务需求,由于最开始存储到es里的,是默认空字符串。

后面程序取数据时,发现需要取空字符串的数据时,不好取出来。

字符串的字段如图:

 

实际数据如图: 

我用的是C#语言,使用的是Elasticsearch.Net和Nest两个类库,查找字符串为空的数据。

最开始找网上的资料,使用的判断条件是MustNot+Term:

Func<QueryContainerDescriptor<HotModelEsModel>, QueryContainer> query = 
    q => q.Bool(a => a.MustNot(m => m.Term(f => f.DataDate, "")));

对应的Request是:

竟然把我的条件去掉了!拿到的结果自然就是错的。

只能再继续找资料,使用新的判断条件是MustNot+Wildcard:

Func<QueryContainerDescriptor<HotModelEsModel>, QueryContainer> query = 
    q => q.Bool(a => a.MustNot(m => m.Wildcard(f => f.DataDate, "*")));

对应的Request是:拿到的结果却是空的。

 只能继续查找资料,使用Script方式:

Func<QueryContainerDescriptor<HotModelEsModel>, QueryContainer> query = 
    q => q.Script(c => c.Script(d => d.Source("doc['DataDate'].value==''").Lang(ScriptLang.Painless)));

  对应的Request是:

 终于完美拿到结果了!

 

但是Script相对来说效率会低一点点,不到万不得已不使用。

 因为之前问过大佬,大佬给了一个新的解决方案Terms+Verbatim:

Func<QueryContainerDescriptor<HotModelEsModel>, QueryContainer> query = 
    q => q.Terms(tf => tf.Verbatim().Field(t => t.DataDate).Terms(new string[] { "" }));

  对应的Request是:

 也成功了!

把大佬的方案再优化一下,使用Term+Verbatim:

Func<QueryContainerDescriptor<HotModelEsModel>, QueryContainer> query = 
    q => q.Term(c => c.Verbatim().Field(p => p.DataDate).Value(""));

  对应的Request是:

完美拿到想要的数据!

拿到数据之后,查了一下Verbatim,这个是用于不分词,完全按照搜索条件去搜索。

所以可以完整地匹配空字符串。

具体官方解释资料,可以看这个:

Verbatim and Strict Query Usage | Elasticsearch .NET Clients [7.17] | Elastic  
https://www.elastic.co/guide/en/elasticsearch/client/net-api/7.17/verbatim-and-strict-query-usage.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

willgon123

谢谢打赏,我将再接再厉!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值