按复杂对象字段查询

时间:2019-08-28 13:17:11

标签: elasticsearch spring-data-elasticsearch

考虑具有复杂对象字段的文档:

@Getter  @Setter
@Document
class A{
   @Id
    private String id;

 @Field(
        type = FieldType.Object,
        includeInParent = true
    )
    private B b;
}

@Getter  @Setter
class B{
String field1;
C c;
}

@Getter  @Setter
class C{
String field1;
}

public interface ARepo extends ElasticsearchRepository<A, String> {
    Optional<A> findByB(B b);
}

当我执行aRepo.findByB(someB)时,内置查询不会提取B字段,而是包含someB.toString()的结果作为字段b的过滤器。

我有JPA背景,并且期待类似的行为。如果不支持此功能,那么对于此类查询,推荐的方法是什么?

谢谢

1 个答案:

答案 0 :(得分:1)

您正在寻找的内容相当于Query By Example(QBE),Spring-Data-ES尚不支持此功能。

如果您的映射是由应用程序决定的(@Mapping并且dynamic mapping设置为false的字段上的@Field),并且通过查看公共{{1} }-您将必须先使用QueryBuilder(弹性抽象)或Criteria(Spring-Data-ES抽象)然后再使用customizing your repository来手动构建查询。

如果您的映射关系不是由应用程序确定的(之前已在elastic上设置),则您必须知道它field types(它是'text','keyword'等),否则可能会有所不同每种类型(匹配查询,词条查询,过滤器等)的预期行为-并且还必须使用QueryBuilder或Criteria自定义实现。