Elasticsearch如何查询使用JSON字符串的DSL

三世轮回 提交于 2020-07-26 04:25:24

背景

    Java处理ES查询逻辑,有一种情况是用户从其他地方粘贴或者手动输入的JSON字符串的DSL语句;这个时候就没法使用QueryBuilder来构建所需要的SearchSource。查了查发现有个Wrapper的方式可以处理;

实现

    代码贴在下面了。首先创建WrapperQueryBuilder对象,通过两种方式均可。1是直接new、2是调用静态方法wrapperQuery;其次还是创建SearchSourceBuilder,指定去query内容为wqb。再次构建SearchRequest对象即可;

String body = "{\"term\":{\"uid\":{\"value\":1}}}";
//Wrapper使用Json查询字符串来构建QueryBuilder//WrapperQueryBuilder wqb = QueryBuilders.wrapperQuery(body);
WrapperQueryBuilder wqb = new WrapperQueryBuilder(body);
SearchSourceBuilder ssb = new SearchSourceBuilder();

ssb.query(wqb);
SearchRequest request = new SearchRequest("es_index").types("doc_type");
request.source(ssb);
client.search(request, RequestOptions.DEFAULT);

注意事项

    1,查询用的JSON DSL格式不包括最外面的query关键字层;否则会查询失败。

    2,client可以使用RestHeighLevelClient,但是需要注意与ES服务器直接版本的关系。

    3,Wrapper查询构造器的toString的内容和常规的DSL语言不一致;使用wrapper的样子如下,这样不是错误:

 

"wrapper" : {
    "query" : "eyJxdWVyeSI6eyAgICAidGVybSI6IHsgICAgICAidWlkIjogeyAgICAgICAgInZhbHVlIjogIjE5ODIwODc0IiAgICAgIH0gICAgfX19"
  }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!