elasticsearch查询中的特殊字符影响分析
大家先看一个执行的dsl 查询sql,大致的意思是排除某些分类下的商品
GET /productinfos/_search
{"from": 0,"query": {"bool": {"must": [{"exists": {"field": "minprice"}},{"bool": {"should": [{"terms": {"productClass": ["-114-","-114-113-","-2-","-5-58-","-61-69-","-7-","-7-82-"]}}]}}],"must_not": [{"terms": {"spuId": ["85","7","10","11"]}}]}},"size": 10,"sort": [{"_score": {"order": "desc"}}]
}
当我在kibana中执行的时候,可以很快速的查询出结果,但是当我用java api 执行的时候,完全一样的dsl,但是是查询不到结果的。
索引中的 productClass 是keyword类型,我第一反应就是匹配的值不对,第二反应就是特殊字符没有转义,当我用// * 各种转义符处理的时候,依然是这种情况,我就开始深度思考了。
我观察了数据的形式 -114-113-,突然想到了可能是-的问题,果不其然,-在elasticsearch中还有一层表示,就是 must_not,也就是 相当于去匹配了 114-113- ,这样肯定是匹配不到的。
但是为什么在kibana 中是可以的呢?原来kibana是会自动处理的。
如果去全量更新数据的值,这个工作量和复杂度实在是不可取,到底能不能用api去匹配,当然可以!但是需要注意两点
1 字段必须有个keyword类型
2 还要避开 - 这个特殊字符的 特殊含义
索引在api中不能直接用字段productClass字段,需要指定为productClass.keyword,强制按照string类型去匹配
结果一切正常!!
所以我们以后存储数据的时候,一定要注意字符的使用!不然大坑实在是太多。