(摘抄自公司大牛的笔记,自己总结一下)
类比mysql,我们需要=、>、>=、<、<= 、or、and、in、like、count、sum、group by、order by、limit
在高版本的ES里面使用了boolquery替换了filter
1、等于号=
QueryBuilders.termQuery("isDel",1));
//termQuery相当于=,相当于isDel=1
2、大于小于号
QueryBuilders.rangeQuery("overdueStartTime").lte(startDate.getTime())
//rangeQuery
//lte <=
//lt <
//gte >=
//gt >
3、or、and
boolQueryBuilder.must(QueryBuilders.termQuery("isDel",req.getIs_del()));
//must相当于and
caseStatusQuery.should(QueryBuilders.termQuery("caseStatus",s));
//should相当于or
4、in
QueryBuilders.termsQuery("clientCompanyId",req.getClientCompanyIdList())
//termQuery相当于in,可以传递list
5、like
QueryBuilders.wildcardQuery("phone1", "*" + req.getTelephone() + "*")
//wildcard 正则匹配
QueryBuilders.matchPhraseQuery("debtorName", req.getDebtor_name())
//matchPhrase 不会分词,直接匹配有完整相关短语的记录
6、sum&&count
AggregationBuilder debtTotalSum = AggregationBuilders.sum(DEBT_TOTAL_SUM_KEY).field("debtTotal");
AggregationBuilder debtTotalCount = AggregationBuilders.count(DEBT_TOTAL_COUNT_KEY).field("debtTotal");
7、order by and limit
SearchResponse searchResponse = client.prepareSearch(ElasticSearchUtil.getIndexName())
.setTypes(ElasticSearchUtil.TYPE_NAME)
.setQuery(boolQueryBuilder)
//指定查询字段
.addStoredField("id")
.addSort(order, sortOrder)
//分页
.setFrom((currentPage - 1) * limit).setSize(limit)
.execute()
.actionGet();
8、批量插入
public void batchInsert(List<CaseTable> list,Client client) {
LOGGER.info("---------案件批量插入索引开始--------");
BulkRequestBuilder bulkRequest = client.prepareBulk();
long start = System.currentTimeMillis();
BulkRequestBuilder delRequest = client.prepareBulk();
for (CaseTable caseTable :list){
IndexRequestBuilder ir = client.prepareIndex()
.setIndex(ElasticSearchUtil.INDEX_NAME_CASE)
.setType(ElasticSearchUtil.TYPE_NAME_CASE)
.setId(caseTable.getId().toString())
.setSource(JSON.toJSONString(caseTable));
bulkRequest.add(ir);
start = System.currentTimeMillis();
BulkResponse bulkResponse = bulkRequest.execute().actionGet();
LOGGER.info("案件批量插入循环所用时间 search time:{}ms", System.currentTimeMillis() - start);
if (!bulkResponse.hasFailures()) {
LOGGER.info("----------案件批量插入成功一轮------------");
}
}
9、踩过的坑
- 当查询条件多余1024个时,会报错
- 当分页的记录大于10000时,会报错
- 当使用浮点数进行sum时会有精度丢失
- 当group by字段是非数字时,会报错
- 如果terms(in)条件比较多的话,使用must则非常慢
- 大数值的比较不生效,如1505446228090(13位)居然小于905446228090(12位)
- ES的数据存放目录被设置到了系统盘,导致磁盘被沾满