Elasticsearch 6中一个索引的多个映射

时间:2019-01-23 01:55:00

标签: elasticsearch

我有一个索引,其中包含不同类型的文档(此处不谈论_type),每个文档都有一个说明其类型的字段document_type。是否可以为该索引内的每种类型的文档定义映射?

3 个答案:

答案 0 :(得分:0)

否,如果要使用单个索引,则需要定义一个将每种文档类型的字段组合在一起的映射。

更好的方法可能是在每种文档类型的同一群集上定义单独的索引。然后,如果您希望能够跨文档类型进行查询,则可以创建一个单独的index alias作为这两个索引的别名。确保两个文档中存在的所有字段在两个映射中都具有相同的数据类型。

答案 1 :(得分:0)

在同一索引中不能有一个字段名称具有多个映射类型。我可以想到两个选择: 1.分隔不同的文档类型以分隔索引。 2.对不同的文档类型使用不同的字段名称,以便每个名称可以具有不同的映射。您还可以在同一索引中使用嵌套,例如:type_a.my_field和type_b.my_field。

答案 2 :(得分:0)

  

是否可以在此索引中为每种类型的文档定义映射?

否,如果您考虑将 相同 字段名称使用不同的类型。例如,字符串类型和整数类型的字段名称 id 无效。

具有不同的 document_type 基本上表示不同的域。您可以做的是将信息分组在每个各自的域或类型下。例如,一个雇员和一个项目都有一个ID和名称,但是在此示例中,它们的类型不同。有人称其为嵌套。

索引映射示例:

PUT example
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  }, 
  "mappings": {
    "doc": {
      "properties": {
        "employee": {
          "properties": {
            "id": {
              "type": "integer"
            },
            "name": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 64
                }
              }
            }
          }
        },
        "project": {
          "properties": {
            "id": {
              "type": "keyword"
            },
            "name": {
              "type": "keyword",
              "ignore_above": 32
            }
          }
        }
      }
    }
  }
}

如果您编写信息,则使用不同的类型。

PUT example/doc/1
{
  "employee": {
    "id": 4711,
    "name": "John Doe"
  },
  "project": {
    "id": "Project X",
    "name": "Firebrand"
  }
}

其他人则主张将员工和项目存储在单独的索引中。此方法取决于您的方案,也是可取的。您允许两个域彼此独立发展。

拥有单独的员工和项目索引可为您提供维护方面的优势。对于查询有些人会说,您可以使用别名进行分组。在上面的示例中,这没有意义,因为字段类型不同。在analysed text field上搜索名称与在keyword上搜索名称不同。如果您具有 相同 字段类型,则查询很有意义。