gpt4 book ai didi

object - 如何为自定义对象列表声明嵌套字段类型?

转载 作者:行者123 更新时间:2023-12-02 23:14:42 24 4
gpt4 key购买 nike

我有一个用SearchFields嵌套类型定义的类。我能够保存文档,但是在使用repository.findAll()检索时出现错误:org.springframework.data.elasticsearch.ElasticsearchException: failed to map source [ {"id":"P2_P2","parentId":"P2","searchFieldsList":[{"id": "N2", "sender":false,"domains":[]}]}] to class MyFlags

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.SearchFields` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"id":"P2_P2","parentId":"P2","searchFields":[{"id":"N2","sender":false,"domains":[]}]}"; line: 1, column: 58] (through reference chain: com.MyFlags["searchFields"]->java.util.ArrayList[0])
@Document(indexName = "#{@myIndexName}", type = SearchConstants.MY_TYPE)
@Setting(settingPath = SearchConstants.MY_INDEX_SETTINGS_PATH)
public class MyFlags {

@Id
private String id;

@Parent(type = SearchConstants.DOCUMENT_TYPE)
private String parentId;

@Field(type = FieldType.Nested)
private List<SearchFields> searchFieldsList;

@Override
public String getId() {
return id;
}

@Override
public void setId(String id) {
this.id = id;
}

public MyFlags() {
}

public void setParentId(String parentId) {
this.parentId = parentId;
}

public String getParentId() {
return parentId;
}

public List<SearchFields> getSearchFieldsList() {
return searchFieldsList;
}

public void setSearchFieldsList(List<SearchFields> searchFieldsList) {
this.searchFieldsList = searchFieldsList;
}
}
SearchFields类为:
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SearchFields extends Serializable {

@Field(type = FieldType.Keyword)
private String id;

@Field(type = FieldType.Boolean)
private boolean sender;

@Field(type = FieldType.Keyword)
private Set<String> domains;

public EmailChainSearchFields(String id) {
this.id = id;
}

public String getSender() {
return sender;
}

public void setSender(boolean senderDomain) {
this.senderDomain = senderDomain;
}

public Set<String> getDomains() {
return domains;
}

public void setDomains(Set<String> domains) {
this.domains = Sets.newHashSet();
}
}

kibana上显示的映射为
{
"my_index_name": {
"aliases": {},
"mappings": {
"my_flags": {
"_parent": {
"type": "document_type"
},
"_routing": {
"required": true
},
"properties": {
"searchFieldsList": {
"type": "nested",
"properties": {
"sender": {
"type": "boolean"
},
"domains": {
"type": "keyword"
}
}
}
}
}
}

我在线阅读的示例(包括SO)没有定义列表。仅定义一个对象代替 searchFieldsList。所以我想知道这可能是我要出问题的地方。

编辑1:

匹配 my_type类型的kibana中的所有查询结果
{
"_index": "my_index_name",
"_type": "my_type",
"_id": "P1_P1",
"_score": 1,
"_routing": "P1",
"_parent": "P1",
"_source": {
"id": "P1_P1",
"parentId": "P1",
"emailChainSearchFields": [
{
"id": "N4",
"sender": false,
"domains": [
"wahtever.com"
],
},
{
"id": "N1",
"sender": true,
"domains": [
"google.com"
]
}
]
}
}

最佳答案

嵌套对象将成为唯一成员吗?如果是这样,那么我不确定该映射将为您提供什么值(value)。您可以简单地使用“searchFields”文档类型。

此外,映射中嵌套字段的名称应针对单个文档,即searchFields。父文档中将包含多个这些嵌套文档。

最后,一个可能的解决方案:SearchFields类具有“id”作为成员,而映射中的嵌套对象则没有。另外,您将需要更改映射(searchFieldsList-> searchFields)。进行这些更改后,请重试。

另外,请确保每个实体(主文档和嵌套文档)都具有默认构造函数。

关于object - 如何为自定义对象列表声明嵌套字段类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56604381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com