最近线上的es报了一个异常,核心信息如下:
No mapping found for [k1.k2.time] in order to sort on
我们的es索引是嵌套索引,上面的这个异常大致意思是说在某个shard里面嵌套结构里面
k1.k2.time这个字段不存在数据,所以排序失败。
我们知道在ES里面可以分shard和索引,大多数时候我们es索引都是自动按某个规则创建的,比如说按天,按月,按年,这个用过logstash的同学应该都比较熟悉,收集的log基本上都是按天生成索引的,然后我们用kibana查询或者自己写代码查询。
下面看一些问题场景:
(场景1)查询一个不存在的索引
默认情况下,查询一个不存在的索引是会报异常的(no such index....)
,那么如何避免这个问题呢?
有两种办法:
A:每次查询前去使用es的索引api判断这个索引存在不存在,如果不存在就不进行任何操作,存在的话在执行查询,这样就能避免,但这样的问题就是每次都得判断存在不存在多一次查询交互。
B:在构建查询时,使用通配符标识索引,如果这个索引不存在,查询结果就是空,但是不会报异常,这样比较方便,不需要关注存在不存在问题。
一个java api的例子如下:
SearchRequestBuilder search = client.prepareSearch("xxxxx2019-06-13*").setTypes("xxxx")
如上代码,查询这个不存在的索引,这段代码结果不会报错,推荐使用这种方法。
(场景2)查询一个不存在的字段
查询一个不存在的字段es是不会报错的
(场景3)排序一个不存在的字段
默认情况下,排序一个不存在的字段,在es里面也会报错。这里主要分三种情况:
A:排序的单个索引不存在这个字段
B:排序的单个索引存在这个字段,但是它分shard了,如果有3个shard,只有2个shard上有这个字段,另外一个shard上没有这个字段,那么它同样会报异常
C:跨索引查询,如果跨2个索引,一个索引上所有的shard都包含这个字段,另外一个索引有部分shard没有,那么也会出现这个问题
如何解决:
这个也比较好解决,在排序的时候,需要设置在maping里面不存在的里面,应该如何处理,容错代码如下:
search.addSort(SortBuilders.fieldSort("no_exists_field").unmappedType("integer").order(SortOrder.DESC))
注意unmappedType方法了,定义这个值不存在的时候,默认按什么类型处理。
(场景4)在一个不存在的字段上算count,max,min,sum,avg这些指标
求聚合统计这些指标时,也不会报错,但结果值列有不同,详情如下:
count:0
sum:0.0
max:-Infinity
min:Infinity
avg:NaN
(场景5)分组一个不存在的字段
分组一个不存在的字段,也不会报错,返回结果是空
上面这些场景基本涵盖了查询统计大多数的可能出现的问题,需要我们在使用的时候需要注意一下,避免一些不必要的问题。
最后我们来介绍一下es里面一个有用的查询Exists Query:
功能:查询的字段至少有一个非null值才回返回
我们来看官网给的一个例子:
{
"exists" : { "field" : "user" }
}
上面这个查询是查字段user的数据,是不是为空,注意下面的这些数据,是可以被匹配上
{ "user": "jane" } //有数据
{ "user": "" } //空串也代表有数据
{ "user": "-" } //符号也代表有数据
{ "user": ["jane"] }//数组也代表有数据
{ "user": ["jane", null ] } //数组里面有一个不是null也代表有数据
在来看下,那些情况,不能被匹配:
{ "user": null }//null值不能被匹配
{ "user": [] } //空数组不能被匹配
{ "user": [null] } //空数组包含null值也不能被匹配
{ "foo": "bar" } //user字段缺失,也不能被匹配
此外,Exists Query可以非常方便的替代Miss Query看下面的例子:
"bool": {
"must_not": {
"exists": {
"field": "user"
}
}
}
上面这个查询将返回没有user字段的数据,java api写法如下:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.mustNot(QueryBuilders.existsQuery("user"));
注意,经过测试发现一个嵌套索引里面,如果只有一个为空的数组,然后使用嵌套查询Exists Query是会报错的,而使用平铺的Exists Query是不会报错的,也就是说,嵌套的索引里面必须有一个不为空的对象存在,才能使用Exists Query查询语法,来查询相关字段不存在的数据
否则会报错,这一点目前还没看到有任何好的办法来校验多级嵌套结构下的某个索引里面到底存不存在某个嵌套结构,嵌套索引的判断是否存在大致一样
唯一需要注意到是,嵌套结构,一定有一条不为空的数据存在才行
关于嵌套索引结构的校验,请参考下面这个链接:
https://gist.github.com/Erni/7484095
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。
技术债不能欠,健康债更不能欠, 求道之路,与君同行。
分享到:
相关推荐
ElasticSearch笔记教程ElasticSearch笔记教程ElasticSearch笔记教程ElasticSearch笔记教程ElasticSearch笔记教程ElasticSearch笔记教程ElasticSearch笔记教程ElasticSearch笔记教程ElasticSearch笔记教程Elastic...
(狂神)ElasticSearch快速入门笔记,ElasticSearch基本操作以及爬虫(Java-ES仿京东实战),包含了小狂神讲的东西,特别适合新手学习,笔记保存下来可以多看看。好记性不如烂笔头哦~,ElasticSearch,简称es,es是一个...
这篇入门学习笔记将引导初学者了解如何安装、配置以及使用Elasticsearch。 首先,让我们从安装开始。要安装Elasticsearch,你可以访问官方网站(https://www.elastic.co/cn/downloads/elasticsearch)下载最新版本...
ElasticSearch,简称为ES,是一个开源的、高度可扩展的分布式全文检索引擎。它基于 Java 开发,并利用 Lucene 作为其核心,实现了高效索引和搜索功能。ElasticSearch 通过Resultful API简化了与Lucene的交互,隐藏了...
Elasticsearch(简称ES)是一款基于Lucene的开源全文搜索引擎,它提供了分布式、实时、高可扩展的数据存储和搜索能力。在众多大数据分析和实时搜索场景中,Elasticsearch表现出色,成为许多企业的首选技术。 **一、...
Elasticsearch笔记.pdf
Elasticsearch(ES)是一种基于Lucene的分布式、RESTful搜索和分析引擎,广泛应用于日志分析、全文检索、监控等多个领域。这份个人笔记详细深入地介绍了Elasticsearch的核心概念和使用方法,旨在帮助读者全面理解和...
2、es非常重要的一个api,是它的restful api,你自己思考一下,掌握这个es的restful api,可以让你执行一些核心的运维管理的操作,比如说创建索引,维护索引,执行各种refresh、flush、optimize操作,查看集群的健康...
Elasticsearch笔记 Elasticsearch是基于Lucene的开发的搜索引擎,它支持分布式、多用户访问,可以轻松的扩展到上百台服务器,是近实时的搜索引擎,而不是实时的搜索引擎。Elasticsearch通过简单的RESTful API来隐藏...
以下是一些常用的Elasticsearch可视化工具: - **Kibana**:由Elastic公司开发的官方可视化工具,与Elastic Stack(包括Logstash、Beats和Elasticsearch)紧密集成,提供丰富的图表和仪表板创建功能。 - **Grafana*...
ElasticSearch学习笔记 ElasticSearch是基于Apache Lucene的搜索和数据分析引擎,提供了RESTful API用于数据的索引、搜索和分析。本笔记将对ElasticSearch的基本概念、架构、应用场景和实现细节进行详细介绍。 一...
Elasticsearch学习笔记 Elasticsearch(以下简称ES)是当前最流行的搜索引擎之一,本文旨在通过对ES的基本操作和查询语法的介绍,帮助读者快速入门和精通ES。 批量操作 ES提供了多种批量操作方式,包括通过GET _...
### Elasticsearch 概述 #### 1.1 Elasticsearch简介 Elasticsearch是一款基于Lucene的分布式搜索引擎,具有实时处理大量数据的能力。它通过RESTful API提供服务,使得开发者可以通过HTTP请求来管理和查询数据。...
### Elasticsearch核心技术与实战笔记知识点概览 #### 一、ELK Stack概述 - **定义**:ELK Stack是由Elasticsearch、Logstash和Kibana组成的开源软件集合,旨在提供全面的数据抽取、搜索分析和数据可视化解决方案。...
多弹性搜索头,对著名的 Elasticsearch Head 的改进 1.保存和存储几个Elasticsearch端点 2.索引选项卡中的更多列 3. 任何请求现在都可以像 /_cat/indices 一样处理 JSON 返回 4. 更简约的外观(更小的字体等...) ...
根据提供的文件信息,我们可以推断出本篇文章将围绕Elasticsearch 6.2.2版本进行详细介绍,包括其下载方式、主要功能特性以及在实际应用中的常见用途。 ### Elasticsearch简介 Elasticsearch是一款基于Lucene的...
Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,...
适用于7.17.1系列,例如Elasticsearch的7.17.12版本。 elasticsearch-analysis-ik 是一个常用的中文分词器,在 Elasticsearch 中广泛应用于中文文本的分析和搜索。下面是 elasticsearch-analysis-ik 分词器的几个...
Elasticsearch(ES)是一种流行的开源全文搜索引擎,它基于Lucene构建,提供了分布式、RESTful风格的搜索和分析引擎服务。在中文环境下,为了实现精确的分词和搜索,我们需要安装适合版本的分词插件,如“elastic...