栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ElasticSearch之script语法使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ElasticSearch之script语法使用

需求回顾
1、业务需要根据ES内部多个字段进行比较运算
2、不能使用外部参数进行传入比较

技术回顾

1、script参数能够自由定义需要比较运算的字段
2、script参数能够适用各种业务场景,一般restApi实现不了的都能够解决

小试牛刀

本文直接适用java语言进行演示
本次测试查询 【年龄 -10 > 工龄 * 2 】的数据

1、定义项目pom以及application
1.1 pom.xml

   
        org.springframework.boot
        spring-boot-starter-data-elasticsearch
    
     
        org.projectlombok
        lombok
     

1.2 application.yml

spring:
  elasticsearch:
    username: elastic
    password: VaHcSC3mOFfovLWTqW6E
    uris: 10.10.22.174:9200
    connection-timeout: 1s
    socket-timeout: 30s

2、创建es 索引及业务实体

2.1 es文档实体

@Data
@Document(indexName = "users")
public class Users {
​
    
    private Long id;
    
    private String name;
    
    private Integer age;
​
    
    private Integer workAge;
}
​

2.2 创建es索引并增加测试数据

  @Test
    void contextLoads() {
        //创建索引
        boolean usersFlag = elasticsearchRestTemplate.indexOps(IndexCoordinates.of("users")).create();
        if(usersFlag) {
            //设置测试数据
            for (int i = 0; i < 100; i++) {
                Users users = new Users();
                users.setAge(25 + i / 10 + i % 10);
                users.setWorkAge(3 + i / 10 + i % 10);
                users.setName("senfel" + i);
                users.setId(Long.valueOf(i + ""));
                Users save = elasticsearchRestTemplate.save(users);
                System.err.println(save);
            }
        }
    }

2.3 测试数据

3、组装script语句,本次测试查询 <年龄-10 > 工龄 * 2> 的数据
3.1 java查询es语句

 
    @Test
    public void testEsByScript(){
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{"id","name","age","workAge"},null)).withPageable(PageRequest.of(0,10));
        //查询条件
        BoolQueryBuilder queryBuilder = new BoolQueryBuilder();
        ScriptQueryBuilder builderByScript = new ScriptQueryBuilder(new Script("if (doc['age'].value -10 " +
                "> doc['workAge'].value * 2){ return true}else{return false}"));
        queryBuilder.must(builderByScript);
        nativeSearchQueryBuilder.withQuery(queryBuilder);
​
        String esInfo = nativeSearchQueryBuilder.build().getQuery().toString();
        System.err.println(esInfo);
        long count = elasticsearchRestTemplate.count(nativeSearchQueryBuilder.build(), Users.class);
        if(count > 0){
            SearchHits searchHits = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), Users.class);
            List> datas = searchHits.getSearchHits();
            datas.forEach(
                    System.err::println
            );
        }
    }

3.2 es query语句与查询结果

{
  "bool" : {
    "must" : [
      {
        "script" : {
          "script" : {
            "source" : "if (doc['age'].value -10 > doc['workAge'].value * 2){ return true}else{return false}",
            "lang" : "painless"
          },
          "boost" : 1.0
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

总条数45
SearchHit{id=‘0’, score=NaN, sortValues=[0], content=Users(id=0, name=senfel0, age=25, workAge=3), highlightFields={}}
SearchHit{id=‘1’, score=NaN, sortValues=[1], content=Users(id=1, name=senfel1, age=26, workAge=4), highlightFields={}}
SearchHit{id=‘2’, score=NaN, sortValues=[2], content=Users(id=2, name=senfel2, age=27, workAge=5), highlightFields={}}
SearchHit{id=‘3’, score=NaN, sortValues=[3], content=Users(id=3, name=senfel3, age=28, workAge=6), highlightFields={}}
SearchHit{id=‘4’, score=NaN, sortValues=[4], content=Users(id=4, name=senfel4, age=29, workAge=7), highlightFields={}}
SearchHit{id=‘5’, score=NaN, sortValues=[5], content=Users(id=5, name=senfel5, age=30, workAge=8), highlightFields={}}
SearchHit{id=‘6’, score=NaN, sortValues=[6], content=Users(id=6, name=senfel6, age=31, workAge=9), highlightFields={}}
SearchHit{id=‘7’, score=NaN, sortValues=[7], content=Users(id=7, name=senfel7, age=32, workAge=10), highlightFields={}}
SearchHit{id=‘8’, score=NaN, sortValues=[8], content=Users(id=8, name=senfel8, age=33, workAge=11), highlightFields={}}
SearchHit{id=‘10’, score=NaN, sortValues=[10], content=Users(id=10, name=senfel10, age=26, workAge=4), highlightFields={}}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027284.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号