elasticsearch 后集群状态下 聚合时 类型转换错误 原因及分析

来源:互联网 发布:知乎 美丽的句子 编辑:程序博客网 时间:2024/06/05 05:36

先来看下错误

前端错误

  1. 两层聚类时,外面一层返回的key是乱码,这个乱码并不是编码问题,而是根本没有对第二层的聚类分类。第一层里面的数据全部都是一样的。
  2. 直接报错,500或者503,类型转换错误或者解析异常。

后台错误:

[2015-11-30 11:06:56,105][DEBUG][action.search.type       ] [local] failed to reduce searchorg.elasticsearch.action.search.ReduceSearchPhaseException: Failed to execute phase [fetch], [reduce]         at org.elasticsearch.action.search.type.TransportSearchQueryThenFetchAction$AsyncAction$2.onFailure(TransportSearchQueryThenFetchAction.java:159)        at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:41)        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)        at java.lang.Thread.run(Thread.java:745)Caused by: java.lang.ClassCastException: org.elasticsearch.search.aggregations.bucket.terms.LongTerms$Bucket cannot be cast to org.elasticsearch.search.aggregations.bucket.terms.StringTerms$Bucket        at org.elasticsearch.search.aggregations.bucket.terms.StringTerms$Bucket.compareTerm(StringTerms.java:85)        at org.elasticsearch.search.aggregations.bucket.terms.InternalOrder$4.compare(InternalOrder.java:87)        at org.elasticsearch.search.aggregations.bucket.terms.InternalOrder$4.compare(InternalOrder.java:83)        at org.elasticsearch.search.aggregations.bucket.terms.InternalOrder$CompoundOrder$CompoundOrderComparator.compare(InternalOrder.java:284)        at org.elasticsearch.search.aggregations.bucket.terms.InternalOrder$CompoundOrder$CompoundOrderComparator.compare(InternalOrder.java:270)        at org.elasticsearch.search.aggregations.bucket.terms.support.BucketPriorityQueue.lessThan(BucketPriorityQueue.java:37)        at org.elasticsearch.search.aggregations.bucket.terms.support.BucketPriorityQueue.lessThan(BucketPriorityQueue.java:26)        at org.apache.lucene.util.PriorityQueue.insertWithOverflow(PriorityQueue.java:151)        at org.elasticsearch.search.aggregations.bucket.terms.InternalTerms.reduce(InternalTerms.java:195)        at org.elasticsearch.search.aggregations.InternalAggregations.reduce(InternalAggregations.java:140)        at org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregation.reduce(InternalSingleBucketAggregation.java:79)        at org.elasticsearch.search.aggregations.InternalAggregations.reduce(InternalAggregations.java:140)        at org.elasticsearch.search.controller.SearchPhaseController.merge(SearchPhaseController.java:407)        at org.elasticsearch.action.search.type.TransportSearchQueryThenFetchAction$AsyncAction$2.doRun(TransportSearchQueryThenFetchAction.java:147)        at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:36)        ... 3 more

测试分析

以下测试集群中两个机器都单独存储数据

测试

  1. 在Elasticsearch1.6版本下,尝试多次后发现,当集群一开始只有一个时,即另一个并没有启动(两个机器的node.master都是默认值,也就是true)。插入数据,并进行聚类运算是正常的。当启动集群中另一个机器时,由于es会自动复制数据,复制完数据后,再进行聚类查询,结果错误
  2. 在Elasticsearch1.6版本下,集群中的两台机器均启动,此时集群中没有数据。创建mapping并插入数据。再次进行查询,结果正确
  3. 在Elasticsearch1.6版本下,集群中一台机器设置node.master: true,另一个设置为 false,先对master机器进行数据插入后,再启动slave机器进行自动数据复制。再次进行查询,结果错误
  4. 在Elasticsearch1.7版本下,进行了同样的测试,每一次结果都和1.6版本相同。

分析

  1. 由于会出现类型转换错误,但是普通查询并没有出错。猜测是由于elasticsearch在集群中两台机器都可以是master的情况下导致mapping同步问题。而数据本身没错。

解决方法

如果要两个都是master,则需要在集群正常的情况下进行mapping的创建,数据的插入等等,避免出错。

回想

我觉得可能也和我的数据有原因吧,但是就算是数据有问题,索引本身,mapping也不应该出错。这里应该是Elasticsearch有一些问题导致。一下子我并不能从核心来解决这个问题。只能是在集群中,一定要正确使用。

还有一种查询方式,用脚本查询

{  "size": 0,  "aggregations": {    "counts": {      "filter": {        "bool": {          "must": [],          "must_not": []        }      },      "aggregations": {        "testId": {          "terms": {            "script": "doc['test_id'].value"          },          "aggregations": {            "userId": {              "terms": {                "script": "doc['user_id'].value"              }            }          }        }      }    }  }}

最后还有一种方法,由于我的字段是long类型的,而且有很多这样的字段,却只有一个字段有问题,解决方法很简单,把这个字段修改成万能的string类型,就能解决问题。至于到底是什么原因导致的问题,我在看源码,但是,并不能一下子就搞定。稍等……

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 带着超市重返年代 新婚夜,我被冷冰冰的王爷读心了 修仙女配拿了反派剧本 影后的假面童话 克死前夫后我成了心软的神 新婚夜,我治好了失明太子的隐疾 沦陷野玫瑰 完球!我的崽居然是反派 重生后她被憨憨相公娇宠了 师祖回归,徒弟各个是疯批大佬 植物人老公苏醒后,她只想逃 他怎么可能是魔尊 农家小团宠:带着空间撩大佬 快穿做个好婆婆 医路芳华 满级真千金:一品女法医 惊!举重妖精被电竞奶狗缠上了 团宠小农女:带着功德空间去逃荒 被迫快穿后我只想当咸鱼 顶流影帝竹马来讨债 穿越后,太子妃靠种田轰动全京城 高考结束后我和死对头HE了 掉马后满级大佬被迫在热搜上开挂 农门悍妻:黑心莲夫君求抱抱 今日宜婚 嗜酒成瘾 肆意诱哄 快穿之反派女配是bug 落水后,我抢了未来首辅的婚! 玄学大佬在八零年代暴富了! 亚人娘补完手册 大女主爽文女配觉醒之后 太上长老她在线带娃 猎命人 夫人被迫觅王侯 穿书女配养崽忙 反派摄政王有了读心术,我躺赢了 星际大佬在荒野求生综艺爆红 满级女配在恋爱综艺当咸鱼 救命!战神王爷对我动了情 全球角色等级考核