如:索引中有兩個 stock 跟 lowStock;現在需要把stock小於等於lowStock的數據篩選出來;可以利用 script來實現
kibana 請求如下:
get product_search_index/_search { "query":{ "bool": {"must": [ {"script": { "script":{ "source": " return doc['stock'].value<=doc['lowStock'].value", "lang": "painless" } }} ]} } }
java代碼如下:
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
Script script = new Script("doc['stock'].value<=doc['lowStock'].value");
boolQueryBuilder.must(QueryBuilders.scriptQuery(script));
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
searchQueryBuilder.withFilter(boolQueryBuilder); SearchHits<XXXDTO> search = es.search(searchQueryBuilder.build(), XXXDTO.class);
如果 文檔中某一個字段可能不存在可以改寫如下:
get product_search_index/_search { "query":{ "bool": {"must": [ {"script": { "script":{ "source": " long stock=doc['stock'].value;long lowStock=0; if(doc.containsKey('lowStock')&&doc['lowStock'].size()!=0){ lowStock=doc['lowStock'].value; } return stock<=lowStock", "lang": "painless" } }} ]} } }