本文记录了ElasticSearch 从5.6.3升级到7.9.3遇到问题总结。对于升级过程不再详细描述,仅描述升级过程中遇到的问题。
1. 创建索引问题报错:
--创建语句
{
"settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "0"
}
},
"mappings": {
"search": {
"_source": {
"excludes": [
"jyfw"
]
},
"properties": {
"jyfw": {
"type": "text",
"analyzer": "smartcn"
},
"dz": {
"type": "text",
"analyzer": "smartcn"
},
"jyfx": {
"type": "byte"
},
"jyzt": {
"type": "keyword"
},
"mc": {
"type": "text",
"fields": {
"kw": {
"type": "keyword"
},
"standard": {
"type": "text",
"analyzer": "standard"
}
},
"analyzer": "smartcn"
}
}
}
}
}
{
"error": {
"root_cause": [
{
"type": "mapper_parsing_exception",
"reason": "Root mapping definition has unsupported parameters: [search : {_source={excludes=[jyfw]}, properties={sfs={type=keyword}, sssj={format=yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis, type=date},…… fddbr={type=keyword}, jyzt={type=keyword}, fxpj={type=byte}, zyry={analyzer=whitespace, type=text}}}]"
}
],
"type": "mapper_parsing_exception",
"reason": "Failed to parse mapping [_doc]: Root mapping definition has unsupported parameters: [search : {_source={excludes=[jyfw]}, properties={sfs={type=keyword}, sssj={format=yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis, type=date}, ……, zyry={analyzer=whitespace, type=text}}}]",
"caused_by": {
"type": "mapper_parsing_exception",
"reason": "Root mapping definition has unsupported parameters: [search : {_source={excludes=[jyfw]}, properties={sfs={type=keyword}, sssj={format=yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis, type=date}, ……, jyzt={type=keyword}, fxpj={type=byte}, zyry={analyzer=whitespace, type=text}}}]"
}
},
"status": 400
}
解决
将创建语句中,type节点去掉。mapper节点下,直接挂载_source和properties即可解决。上述的创建语句"search"节点就是旧版本中的type,去掉该节点,然后将 _source和properties节点上升一个层级就可以了。如下:
"mappings": {
"_source": {
"excludes": [
"jyfw"
]
},
"properties": {……}
}
2.插入数据问题
curl --location --request PUT 'http://10.57.36.17:9200/dg_ent_search_lr/1f3f5c8fd8416fb2ce03dc7029ab872a'
--header 'Content-Type: application/json'
--data-raw '{
"qylx": "有限责任公司(自然人投资或控股的法人独资)",
"xzqh": "福建省厦门市思明区",
"clrq": "2019-02-02",
"sshy": "互联网和相关服务",
"zcdz": "厦门市思明区观日路608号2层206单元查看地图",
"njrq": "2019-10-21",
"zczb": "3,000万(元)",
"sjzb": "-",
"djjg": "厦门市市场监督管理局",
"tyshxydm": "91350200MA32G64N19",
"persons": "[{"xm":"李金鑫","zw":"总经理"}, {"xm":"李金鑫","zw":"执行董事"}, {"xm":"唐灵潇","zw":"监事"}]",
"gszch": "",
"jyfw": "信息技术咨询服务;软件开发;信息系统集成服务;数据处理和存储服务;其他未列明信息技术服务业(不含需经许可审批的项目)。",
"nsrsbh": "91350200MA32G64N19",
"holders": "[{"cgbl":"100%","sjcze":"-","rjcze":"3,000万(元)","gd":"北京宝沃汽车股份有限公司"}]",
"mc": "厦门宝沃信息技术有限公司",
"cym": "-",
"yyqxks": "2019-02-02",
"fddbr": "李金鑫",
"jyzt": "开业",
"zzjgdm": "MA32G64N-1"
}'
报错
{
“error”: “Incorrect HTTP method for uri [/dg_ent_search_lr/1f3f5c8fd8416fb2ce03dc7029ab872a] and method [PUT], allowed: [POST]”,
“status”: 405
}
将请求地址改为:
http://127.0.0.1:9200/dg_ent_search/index/1f3f5c8fd8416fb2ce03dc7029ab872a
报错2
{
“error”: {
“root_cause”: [
{
“type”: “illegal_argument_exception”,
“reason”: “mapper [jyzt] cannot be changed from type [keyword] to [text]”
}
],
“type”: “illegal_argument_exception”,
“reason”: “mapper [jyzt] cannot be changed from type [keyword] to [text]”
},
“status”: 400
}
解决
将请求地址改为
http://127.0.0.1:9200/dg_ent_search/_doc/1f3f5c8fd8416fb2ce03dc7029ab872a
即可成功。
在index后添加_doc则解决此问题。
3. 聚合查询统计报错:Field [sshy] of type [keyword] is not supported for aggregation [sum]
原因:使用了SumAggregation ,sshy这个字段不是数值类型,无法计算。其实应该用TermsAggregation
4.安装问题报错: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解决: 在 /etc/sysctl.conf 追加最大虚拟空间限制 vm.max_map_count=655360 ,如下,记得 sysctl -p 使系统配置生效。
5.自定义重评分计算错误执行语句如下:
{
"size": 5,
"query": {
"bool": {
"must": [
{
"match_all": {
"boost": 1
}
}
],
"should": [
{
"match_phrase": {
"jyfw": {
"query": "宝沃",
"slop": 20,
"zero_terms_query": "NONE",
"boost": 1
}
}
},
{
"match_phrase": {
"cppp": {
"query": "宝沃",
"slop": 20,
"zero_terms_query": "NONE",
"boost": 1
}
}
},
{
"match_phrase": {
"dh": {
"query": "宝沃",
"slop": 20,
"zero_terms_query": "NONE",
"boost": 1
}
}
},
{
"match_phrase": {
"mc": {
"query": "宝沃",
"slop": 20,
"zero_terms_query": "NONE",
"boost": 1
}
}
},
{
"match_phrase": {
"zcdz": {
"query": "宝沃",
"slop": 20,
"zero_terms_query": "NONE",
"boost": 1
}
}
},
{
"match_phrase": {
"mc.standard": {
"query": "宝沃",
"slop": 20,
"zero_terms_query": "NONE",
"boost": 1
}
}
},
{
"match_phrase": {
"fddbr": {
"query": "宝沃",
"slop": 20,
"zero_terms_query": "NONE",
"boost": 1
}
}
},
{
"match_phrase": {
"zyry": {
"query": "宝沃",
"slop": 20,
"zero_terms_query": "NONE",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"minimum_should_match": "1",
"boost": 5
}
},
"highlight": {
"pre_tags": [
""
],
"post_tags": [
""
],
"fields": {
"mc": {},
"mc.standard": {},
"zcdz": {},
"dh": {},
"jyfw": {},
"zyry": {},
"fddbr": {}
}
},
"rescore": [
{
"query": {
"rescore_query": {
"function_score": {
"query": {
"match_all": {
"boost": 1
}
},
"functions": [
{
"filter": {
"match_all": {
"boost": 1
}
},
"script_score": {
"script": {
"source": "double k_capital=1.0/4;double k_company_age=1.0/3;if(doc['clrq'].size()==0){return 1;}long clrq_ms=doc['clrq'].value.getMillis();double capital=0;if(doc['zczbsz'].size()!=0){capital=doc['zczbsz'].value;}if(capital < 0){capital=0}double score_capital=(2+capital/1000);long company_age_ms=new Date().time-clrq_ms;long valid_date_threshold=-639129600;if((clrq_ms
报错信息如下:
"script_stack": [
"clrq_ms=doc['clrq'].value.toInstant().toEpochMilli();double ",
" ^---- HERE"
],
"caused_by": {
"type": "illegal_argument_exception",
"reason": "dynamic method [java.lang.Long, toInstant/0] not found"
}
上面的问题是因为clrq 这个是一个非日期,没有toInstant()方法。当时排查结果是clrq是一个long型数值。此处的作用是调用date的方法转换成long型时间戳。自然调不到方法。
整改:将clrq的字段类型定义为date类型。并且保证传入的值是日期格式就行。



