Elasticsearch 对索引中的两个字段比较大小进行筛选


如:索引中有两个 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"
        }
      }}
    ]}
  }
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM