接受包含对象或字符串的数组的架构

vyswwuz2  于 2022-09-20  发布在  ElasticSearch
关注(0)|答案(1)|浏览(161)

需要在Elasticearch中存储数组数据。数组可以包含字符串或对象,因此我可以同时接受这两种数组类型。我可以通过定义单独的数组类型来做到这一点。但我需要一个可以接受数组中的字符串或对象的通用解决方案。

要存储在Elasticearch中的对象:

{
  "anotherData": [
     {
        "someData": {
            "testingName": [
                {
                    "alternateName": "Another data",
                    "areaCategory": "some data"
                }
            ]
        }
     }
   ]
}

用于存储上述数据的ElasticSearch架构:

{
  ....
  "mappings": {
    "properties": {
      "testingName": {
        "properties": {
          "alternateName": {
            "type": "keyword"
          },
          "areaCategory": {
            "type": "keyword"
          }
        }
      },
      ....
    }
  }
}

另一个要存储的对象的示例:

{
"anotherData": [
    {
        "someData": {
            "testingName": [
                "this is only a array string"
            ]
        }
    }
  ]
}

对于上面的对象,Elasticearch模式将是:

{
  ....
  "mappings": {
    "properties": {
      "testingName": {
        "type": "keyword"
      },
      ....
    }
  }
}

我需要在模式中将两者组合为“Any of One”条件。我可以存储上面两个对象中的任何一个,它们可以是字符串数组或对象数组。请共享可同时适用于这两种类型的Elasticearch架构。

pgx2nnw8

pgx2nnw81#

相同字段中存储对象或字符串的唯一方法是使用以下Map,即disabled object

"testingName": {
    "type": "object",
    "enabled": false
  }

这意味着您的源文档将被允许具有包含字符串或对象的testingName字段,但最大的缺点是您将无法在该字段上查询

在数据设计方面,有这样的“两头”字段是没有意义的,至少ES不支持这一点。最好有两个不同的字段,一个用于字符串,另一个用于对象。

更新:

以下是该解决方案的完整再现:

PUT test
{
  "mappings": {
    "properties": {
      "testingName": {
        "type": "object",
        "enabled": false
      }
    }
  }
}

PUT test/_doc/1
{
  "testingName": [
    "test"
  ]
}

PUT test/_doc/2
{
  "testingName": [
    {
      "alternateName": "test",
      "areacategory": "test"
    }
  ]
}

GET test/_search

退货

"hits" : [
  {
    "_index" : "test",
    "_type" : "_doc",
    "_id" : "1",
    "_score" : 1.0,
    "_source" : {
      "testingName" : [
        "test"
      ]
    }
  },
  {
    "_index" : "test",
    "_type" : "_doc",
    "_id" : "2",
    "_score" : 1.0,
    "_source" : {
      "testingName" : [
        {
          "alternateName" : "test",
          "areacategory" : "test"
        }
      ]
    }
  }
]

相关问题