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

标签 object elasticsearch nested

我有一个用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/

相关文章:

elasticsearch - 嵌套updatebyquery我如何使用poco而不是编写脚本

java - 如何将复杂的 Java 对象写入 CSV 文件

java - jsoup 无法返回包含所有子节点的完整节点

javascript - 向数组添加通用对象和格式

javascript - 每次用户填写 3 个输入时,如何在数组中自动创建一个对象?

java - 使用elasticsearch获取最近的位置

lucene - 如何在 lucene 3.4 中索引/查询嵌套文档?

java - 如何覆盖 Java 对对象的限制

javascript - jQuery:使用对象值和子值设置元素属性

elasticsearch - 如何在elasticsearch中更新没有ID条件的文档?