速看,ElasticSearch如何处理空值《玩转ElasticSearch 3》-3

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 速看,ElasticSearch如何处理空值《玩转ElasticSearch 3》

大家好,我是咔咔 不期速成,日拱一卒


在MySQL中,十分不建议大家给表的默认值设置为Null,这个后期咔咔也会单独出一期文章来说明这个事情。


但你进入一家新公司之前的业务中存在大量的字段默认值为Null,把这些值导入ElasticSearch中还是需要处理,接下来就看看ElasticSearch如何应对空值。




一、ElasticSearch如何处理Null值的

先看一个案例,当值为null时会发生什么


POST /kaka/_bulk
{ "index": { "_id": "1"}}
{ "tags" : ["search"]}  
{ "index": { "_id": "2"}}
{ "tags" : ["search", "open_source"] }  
{ "index": { "_id": "3"}}
{ "tags" : null                      }  
{ "index": { "_id": "4"}}
{ "tags" :"null"}

在这个案例中可以发现,第3、4都存在一个null值,不同的是一个为字符串null

post /kaka/_search
{
  "query":{
    "term": {
      "tags": null
    }
  },
  "profile":"true"
}

当你执行上面这搜索时会出现下面这个错误


{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "field name is null or empty"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "field name is null or empty"
  },
  "status": 400
}

然后咔咔就跑到ElasticSearch文档找了一下原因,是因为在ElasticSearch中空值不能被索引或搜索,当字段值为null时、空数组、null值数组时,会将其视为该字段没有值


若你执行的语句为如下,则会返回最后一条数据


post /kaka/_search
{
  "query":{
    "term": {
      "tags": "null"
    }
  },
  "profile":"true"
}


二、使用exists解决ElasticSearch中Null值搜索问题

同样在文档中咔咔也找到了答案,案例如下

post /kaka/_search
{
  "query":{
    "constant_score": {
      "filter": {
        "missing": {
          "field": "tags"
        }
      }
    }
  }
}

执行结果返回no [query] registered for [missing],这就让人有点百思不得其解,再通过啃文档后发现这个接口在ElasticSearch7.1已经被取消了,根据文档的意思是exists可以同时满足存在和不存在两种情况


先看使用exists如何查询不为null

post /kaka/_search
{
  "query":{
    "constant_score":{
      "filter":{
        "exists":{
          "field":"tags"
        }
      }
    }
  }
}

再看使用exists查询为null的


post /kaka/_search
{
  "query":{
    "bool":{
      "must_not":{
        "exists":{
          "field":"tags"
        }
      }
    }
  }
}


三、使用null_value替换显示的空值

删除上边定义的索引delete kaka,然后自定义mapping,给tags设置"null_value" : "null",用指定的值替换显示的空值,"null"可以自定义为任意值


使用了null_value这样做的好处就是空字段也可以被索引,同时也不会在查询时报field name is null or empty的错误

put kaka
{
  "mappings":{
    "properties":{
      "tags" :{
        "type":"keyword",
        "null_value":"null"
      }
    }
  }
}


再插入上边的数据


POST /kaka/_bulk
{ "index": { "_id": "1"}}
{ "tags" : ["search"]}  
{ "index": { "_id": "2"}}
{ "tags" : ["search", "open_source"] }  
{ "index": { "_id": "3"}}
{ "tags" : null                      }  
{ "index": { "_id": "4"}}
{ "tags" :"null"}

再次执行查询为null的数据,就会出现第3、4条数据

post /kaka/_search
{
  "query":{
    "term": {
      "tags": "null"
    }
  },
  "profile":"true"
}


四、使用null_value注意点

null_value必须和定义的数据类型匹配,例如long类型的不能定义字符串类型的value_null值

看一下long类型设置了字符串类型value_null会出现什么错误

# 错误演示,long类型使用了字符串类型的null_value值
put kaka
{
  "mappings":{
    "properties":{
      "tags" :{
        "type":"long",
        "null_value":"null"
      }
    }
  }
}

返回错误如下

{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "Failed to parse mapping [_doc]: For input string: \"null\""
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "Failed to parse mapping [_doc]: For input string: \"null\"",
    "caused_by": {
      "type": "number_format_exception",
      "reason": "For input string: \"null\""
    }
  },
  "status": 400
}

注意了数据类型外,你还需要知道value_null不是任何类型都可以使用的,以下列举的类型都可使用null_value

  • Array
  • Boolean
  • Date
  • geo_point
  • ip
  • keyword
  • Numeric
  • point
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
缓存 监控 Java
【Elasticsearch专栏 09】深入探索:Elasticsearch如何处理并发写入和读取请求
Elasticsearch通过分片机制分散读写请求,利用事务日志确保数据持久性,通过多线程处理并发请求,并允许通过配置调整分片和副本数量、线程池设置来优化并发性能。同时,使用批量操作和查询优化进一步提高写入和读取效率。
|
2月前
|
存储 自然语言处理 搜索推荐
【Elasticsearch专栏 06】深入探索:Elasticsearch如何处理倒排索引中的分词问题
Elasticsearch通过内置和可定制的分词器及过滤器处理倒排索引中的分词问题,确保文本被拆分成合适的词条并优化存储,为全文搜索等提供高效支持。用户可通过分析API测试和调整分词效果。
|
SQL 数据建模 索引
Elasticsearch 空值处理实战指南
1、引言 实战业务场景中,经常会遇到定义空值、检索指定空值数据的情况。 这时候,当我们翻看官方文档 null_value 部分,会看到如下的描述: Accepts a string value which is substituted for any explicit null values. Defaults to null, which means the field is treated as missing. 接受一个字符串值替换所有显式的空值。默认为null,这意味着该字段被视为丢失。 A null value cannot be indexed or searched. W
944 0
Elasticsearch 空值处理实战指南
|
存储 数据挖掘
速看,ElasticSearch如何处理空值《玩转ElasticSearch 4》-2
速看,ElasticSearch如何处理空值《玩转ElasticSearch 4》
167 0
|
自然语言处理 关系型数据库 MySQL
速看,ElasticSearch如何处理空值《玩转ElasticSearch 4》-1
速看,ElasticSearch如何处理空值《玩转ElasticSearch 3》
254 0
速看,ElasticSearch如何处理空值《玩转ElasticSearch 4》-1
|
JSON 监控 Apache
Logstash中如何处理到ElasticSearch的数据映射
Logstash作为一个数据处理管道,提供了丰富的插件,能够从不同数据源获取用户数据,进行处理后发送给各种各样的后台。这中间,最关键的就是要对数据的类型就行定义或映射。 本文讨论的 ELK 版本为 5.5.1。
1686 0
|
10天前
|
数据可视化 索引
elasticsearch head、kibana 安装和使用
elasticsearch head、kibana 安装和使用
|
22天前
|
存储 负载均衡 索引
linux7安装elasticsearch-7.4.0集群配置
linux7安装elasticsearch-7.4.0集群配置
109 0
|
2月前
|
存储 监控 搜索推荐
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——安装篇(一)
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——安装篇(一)
|
4月前
ElasticSearch-Head浏览器插件离线安装
ElasticSearch-Head浏览器插件离线安装
91 0

热门文章

最新文章