我可以使用弹性搜索查询构建器的toString方法,因为它返回可使用邮递员/木假名运行的DSL查询。
内部工作:
一旦包含所有子句的所有querybuilder形成,即使以DSL形式的复杂查询也以可运行形式返回。因此,我可以直接使用DSL吗?
我调查了弹性搜索Strings.class的内部,它具有toString方法。每个构建器类都实现具有toXContent(XContentBuilder builder, Params params)
方法的ToXContent接口。 XContentBuilder
调用doXContent
,后者调用相应查询构建器的XContent,例如BoolQueryBuilder
。当RestHighLevelClient
像Strings类一样调用SearchSourceBuilder
时,也会调用QueryBuilder的doXContent方法。简而言之,两者都使用toXContent()方法。如果使用RestHighLevelClient,则由Request.createEntity()创建一个HttpEntity,它是查询的toString版本的字节形式,并由ES服务器执行。 因此es服务器还执行dsl版本。
doc在此也提到: 请注意,您可以使用QueryBuilder对象上的toString()方法轻松打印(aka调试)JSON生成的查询。