背 景
博主有次在给ES导数的时候,将Hive内的一个字段导入ES内,一直报错说什么null值异常,要么就是如果这个field有null,那么当它是null的时候这条记录的这个field不见了,其他不为null的field的还存在,一开始一脸懵逼,后面经过查阅了官网发现原来ES不支持null值;
其实我们想想原理也很简单,因为ES是根据他的field来做倒排索引,如果给的是个null值,你让怎么排呢对吧?
全文索引:也叫倒排索引
,将需要匹配搜索条件的一段词语根据分词器进行分词,分出的单个词语放到一个分词库中,并且标注这个词隶属于哪一个行目标数据id;于是客户端在搜索时,根据搜索内容也进行分词到分词库中去检索,然后找打匹配的内容,具体如图1;
所以ES比较野蛮的处理了null值,当某一个文档的某一个field出现null值时,他会把这个field直接去掉,如下,id等于4的这个tags 的field就直接看不到了,注意哈,不是整条记录看不到,只是这个为null的field看不到,这个记录的其他field还是能看见的;
POST /my_index/posts/_bulk
{
"index": {
"_id": "1" }}
{
"tags" : ["search"] }
{
"index": {
"_id": "2" }}
{
"tags" : ["search", "open_source"] }
{
"index": {
"_id": "3" }}
{
"other_field" : "some data" }
{
"index": {
"_id": "4" }}
{
"tags" : null }
解决方法
- 在数据库端处理好null值,给他赋值默认值,如数值型为0.string型为"",时间为"1990-01-01"等;
- ES本身提供的exists函数,使用这种有null的字段时,先判断是否exists;
# 例1,过滤判断
GET /my_index/posts/_search
{
"query" : {
"constant_score" : {
"filter" : {
"exists" : {
"field" : "tags" }
}
}
}
}
# 例2 查询判断
POST /sat_rs_building_info_v0/_search
{
"query": {
"bool": {
"must": [
{
"exists":
{
"field": "amap_city_code"
}
}
,{
"match": {
"amap_city_name": "上海市"
}
}
]
}
}
}
以上就是ES处理null的方式,更多详细的讲解,可参考官网:处理 Null 值;
本文参考链接:https://blog.csdn.net/LXWalaz1s1s/article/details/111152394