多語言網(wǎng)站建設(shè)推廣青島網(wǎng)站建設(shè)運(yùn)營(yíng)推廣
之前有個(gè)業(yè)務(wù)需求,由于最開始存儲(chǔ)到es里的,是默認(rèn)空字符串。
后面程序取數(shù)據(jù)時(shí),發(fā)現(xiàn)需要取空字符串的數(shù)據(jù)時(shí),不好取出來。
字符串的字段如圖:
?
實(shí)際數(shù)據(jù)如圖:?
我用的是C#語言,使用的是Elasticsearch.Net和Nest兩個(gè)類庫,查找字符串為空的數(shù)據(jù)。
最開始找網(wǎng)上的資料,使用的判斷條件是MustNot+Term:
Func<QueryContainerDescriptor<HotModelEsModel>, QueryContainer> query = q => q.Bool(a => a.MustNot(m => m.Term(f => f.DataDate, "")));
對(duì)應(yīng)的Request是:
竟然把我的條件去掉了!拿到的結(jié)果自然就是錯(cuò)的。
只能再繼續(xù)找資料,使用新的判斷條件是MustNot+Wildcard:
Func<QueryContainerDescriptor<HotModelEsModel>, QueryContainer> query = q => q.Bool(a => a.MustNot(m => m.Wildcard(f => f.DataDate, "*")));
對(duì)應(yīng)的Request是:拿到的結(jié)果卻是空的。
?只能繼續(xù)查找資料,使用Script方式:
Func<QueryContainerDescriptor<HotModelEsModel>, QueryContainer> query = q => q.Script(c => c.Script(d => d.Source("doc['DataDate'].value==''").Lang(ScriptLang.Painless)));
??對(duì)應(yīng)的Request是:
?終于完美拿到結(jié)果了!
?
但是Script相對(duì)來說效率會(huì)低一點(diǎn)點(diǎn),不到萬不得已不使用。
?因?yàn)橹皢栠^大佬,大佬給了一個(gè)新的解決方案Terms+Verbatim:
Func<QueryContainerDescriptor<HotModelEsModel>, QueryContainer> query = q => q.Terms(tf => tf.Verbatim().Field(t => t.DataDate).Terms(new string[] { "" }));
??對(duì)應(yīng)的Request是:
?也成功了!
把大佬的方案再優(yōu)化一下,使用Term+Verbatim:
Func<QueryContainerDescriptor<HotModelEsModel>, QueryContainer> query = q => q.Term(c => c.Verbatim().Field(p => p.DataDate).Value(""));
??對(duì)應(yīng)的Request是:
完美拿到想要的數(shù)據(jù)!
拿到數(shù)據(jù)之后,查了一下Verbatim,這個(gè)是用于不分詞,完全按照搜索條件去搜索。
所以可以完整地匹配空字符串。
具體官方解釋資料,可以看這個(gè):
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