ES5之后,数值类型应该避免term查询
https://t.zsxq.com/fhroW
使用term会拖慢查询
ES5.X之后,数值类型并没有采用倒排索引, 而是以value为序,将docid切分到不同的block里面。
数值型字段的TermQuery被转换为了PointRangeQuery。这个Query利用Block k-d tree进行范围查找速度非常快,但是满足查询条件的docid集合在磁盘上并非向Postlings list那样按照docid顺序存放,也就无法实现postings list上借助跳表做蛙跳的操作。 要实现对docid集合的快速advance操作,只能将docid集合拿出来,做一些再处理。
优化:
数值类型,且查询时一般使用term查询,比如status字段、deleted字段等,应该设计为keyword类型。
如果已经无法变更类型或者加字段了,那么可以改为range查询,或者给字段加类型
"remark" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
},
"analyzer" : "like_analyzer"
}
加字段后改造查询
QueryBuilders.termQuery("stauts.keyword",1);
或者不加类型,改为range查询也会更快