构建 API 对象
编辑构建 API 对象
编辑构建器对象
编辑Java API 客户端中的所有数据类型都是不可变的。对象创建使用在 2008 年的Effective Java中推广的构建器模式。
ElasticsearchClient client = ... CreateIndexResponse createResponse = client.indices().create( new CreateIndexRequest.Builder() .index("my-index") .aliases("foo", new Alias.Builder().isWriteIndex(true).build() ) .build() );
请注意,在调用 build()
方法后,不应重复使用构建器。
构建器 Lambda 表达式
编辑虽然这种方法运行良好,但必须实例化构建器类并调用 build()
方法有点冗长。因此,Java API 客户端中的每个属性设置器也接受一个 Lambda 表达式,该表达式将新创建的构建器作为参数并返回一个填充的构建器。上面的代码段也可以写成
ElasticsearchClient client = ... CreateIndexResponse createResponse = client.indices() .create(createIndexBuilder -> createIndexBuilder .index("my-index") .aliases("foo", aliasBuilder -> aliasBuilder .isWriteIndex(true) ) );
这种方法允许编写更简洁的代码,并且还避免导入类(甚至记住它们的名称),因为类型是从方法参数签名中推断出来的。
请注意,在上面的示例中,构建器变量仅用于启动属性设置器链。因此,这些变量的名称并不重要,可以缩短以提高可读性。
ElasticsearchClient client = ... CreateIndexResponse createResponse = client.indices() .create(c -> c .index("my-index") .aliases("foo", a -> a .isWriteIndex(true) ) );
构建器 Lambda 在处理如下所示的复杂嵌套查询时特别有用,该查询取自区间查询 API 文档。
此示例还突出显示了深度嵌套结构中构建器参数的有用命名约定。对于只有一个参数的 Lambda 表达式,Kotlin 提供了隐式 it
参数,Scala 允许使用 _
。这可以通过在 Java 中使用下划线或一个字母前缀后跟表示深度级别的数字(即 _0
、_1
或 b0
、b1
等)来近似实现。这不仅消除了创建临时变量名称的需要,而且还提高了代码的可读性。正确的缩进还可以使查询的结构脱颖而出。
ElasticsearchClient client = ... SearchResponse<SomeApplicationData> results = client .search(b0 -> b0 .query(b1 -> b1 .intervals(b2 -> b2 .field("my_text") .allOf(b3 -> b3 .ordered(true) .intervals(b4 -> b4 .match(b5 -> b5 .query("my favorite food") .maxGaps(0) .ordered(true) ) ) .intervals(b4 -> b4 .anyOf(b5 -> b5 .intervals(b6 -> b6 .match(b7 -> b7 .query("hot water") ) ) .intervals(b6 -> b6 .match(b7 -> b7 .query("cold porridge") ) ) ) ) ) ) ), SomeApplicationData.class );
上面示例的源代码可以在Java API 客户端测试中找到。