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