列表和映射
编辑列表和映射
编辑增量构建器 setter
编辑类型为 List
和 Map
的属性通过对象构建器公开为一组重载的仅增量方法,这些方法通过将新条目追加到列表以及将新条目添加到映射(或替换现有条目)来更新属性值。
对象构建器创建不可变对象,这也适用于在对象构造时变得不可变的列表和映射属性。
// Prepare a list of index names List<String> names = Arrays.asList("idx-a", "idx-b", "idx-c"); // Prepare cardinality aggregations for fields "foo" and "bar" Map<String, Aggregation> cardinalities = new HashMap<>(); cardinalities.put("foo-count", Aggregation.of(a -> a.cardinality(c -> c.field("foo")))); cardinalities.put("bar-count", Aggregation.of(a -> a.cardinality(c -> c.field("bar")))); // Prepare an aggregation that computes the average of the "size" field final Aggregation avgSize = Aggregation.of(a -> a.avg(v -> v.field("size"))); SearchRequest search = SearchRequest.of(r -> r // Index list: // - add all elements of a list .index(names) // - add a single element .index("idx-d") // - add a vararg list of elements .index("idx-e", "idx-f", "idx-g") // Sort order list: add elements defined by builder lambdas .sort(s -> s.field(f -> f.field("foo").order(SortOrder.Asc))) .sort(s -> s.field(f -> f.field("bar").order(SortOrder.Desc))) // Aggregation map: // - add all entries of an existing map .aggregations(cardinalities) // - add a key/value entry .aggregations("avg-size", avgSize) // - add a key/value defined by a builder lambda .aggregations("price-histogram", a -> a.histogram(h -> h.field("price"))) );
列表和映射的值永远不是 null
编辑Elasticsearch API 有很多可选属性。对于单值属性,Java API 客户端将缺失的可选值表示为 null
。因此,应用程序在使用可选值之前必须执行 null 检查。
然而,对于列表和映射,应用程序通常只关心它们是否为空,甚至只是迭代它们的内容。使用 null
值会很麻烦。为了避免这种情况,Java API 客户端的集合属性永远不会是 null
,并且缺失的可选集合将作为空集合返回。
如果您需要区分缺失(未定义)的可选集合和 Elasticsearch 返回的实际为空的集合,ApiTypeHelper
类提供了一个实用方法来区分它们
NodeStatistics stats = NodeStatistics.of(b -> b .total(1) .failed(0) .successful(1) ); // The `failures` list was not provided. // - it's not null assertNotNull(stats.failures()); // - it's empty assertEquals(0, stats.failures().size()); // - and if needed we can know it was actually not defined assertFalse(ApiTypeHelper.isDefined(stats.failures()));
以上示例的源代码可以在 Java API 客户端测试中找到。