列表和映射

编辑

增量构建器设置器

编辑

类型为 ListMap 的属性通过对象构建器以一组重载的仅增量方法公开,这些方法更新属性值,方法是追加到列表和向映射添加新条目(或替换现有条目)。

对象构建器创建不可变对象,这同样适用于在对象构造时变为不可变的列表和映射属性。

// 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 值会很麻烦。为了避免这种情况,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 客户端测试 中找到。