当前位置: 首页 > 知识库问答 >
问题:

是否仅为elasticsearch上的特定索引禁用动态映射创建?

养慈
2023-03-14

我正在尝试仅对特定索引禁用动态映射创建,而不是对所有索引禁用。出于某种原因,我无法将默认映射设置为“dynamic”:“false”。所以,这里有两个选项,我可以看到:

  1. 指定属性的索引。制图员。“动态”文件弹性搜索。yml

第一个选项只能接受值:true、false和strict。因此,无法指定特定索引的子集(就像我们使用属性“action.auto_create_index”按模式所做的那样)https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#index-(创造)。

第二种选择根本不起作用。我已经创建了索引

POST http://localhost:9200/test_idx/
{
    "settings" : {
        "mapper" : {
            "dynamic" : false
        }
    },
    "mappings" : {
        "test_type" : {
            "properties" : {
                "field1" : {
                    "type" : "string"
                }
            }
        }
    }
}

然后检查索引设置:

GET http://localhost:9200/test_idx/_settings    
{
    "test_idx" : {
        "settings" : {
            "index" : {
                "mapper" : {
                    "dynamic" : "false"
                },
                "creation_date" : "1445440252221",
                "number_of_shards" : "1",
                "number_of_replicas" : "0",
                "version" : {
                    "created" : "1050299"
                },
                "uuid" : "5QSYSYoORNqCXtdYn51XfA"
            }
        }
    }
}

和映射:

GET http://localhost:9200/test_idx/_mapping
{
    "test_idx" : {
        "mappings" : {
            "test_type" : {
                "properties" : {
                    "field1" : {
                        "type" : "string"
                    }
                }
            }
        }
    }
}

到目前为止还不错,让我们用未声明的字段索引文档:

POST http://localhost:9200/test_idx/test_type/1
{
    "field1" : "it's ok, field must be in mapping and in source",
    "somefield" : "but this field must be in source only, not in mapping"
}

然后我再次检查了映射:

GET http://localhost:9200/test_idx/_mapping
{
    "test_idx" : {
        "mappings" : {
            "test_type" : {
                "properties" : {
                    "field1" : {
                        "type" : "string"
                    },
                    "somefield" : {
                        "type" : "string"
                    }
                }
            }
        }
    }
}

如您所见,无论索引设置如何,映射都是扩展的“动态”: false。我还试图完全按照文档中的描述创建索引

PUT http://localhost:9200/test_idx
{
    "index.mapper.dynamic": false
}

但他们也有同样的行为。

也许我错过了什么?

非常感谢!

共有3个答案

姬乐池
2023-03-14

答案在文档(7x.):https://www.elastic.co/guide/en/elasticsearch/reference/7.x/dynamic.html

动态设置控制是否可以动态添加新字段。它接受三种设置:

符合事实的

新检测到的字段将添加到映射中。(默认)

新检测到的字段将被忽略。这些字段不会被索引,因此不可搜索,但仍会出现在返回点击的_source字段中。这些字段不会添加到映射中,必须显式添加新字段。

严格的

如果检测到新字段,将引发异常并拒绝文档。新字段必须显式添加到映射中。

PUT my_index
{
  "mappings": {
    "dynamic": "strict", 
    "properties": {
      "user": { 
        "properties": {
          "name": {
            "type": "text"
          },
          "social_networks": { 
            "dynamic": true,
            "properties": {}
          }
        }
      }
    }
  }
}
封俊艾
2023-03-14

你必须知道下面的部分仅仅意味着ES不能动态地创建一个类型。

"mapper" : {
        "dynamic" : false
    }

您应该这样配置ES:

PUT http://localhost:9200/test_idx/_mapping/test_type
{
  "dynamic":"strict"
}

那么,如果不进行任何映射,就无法为其他字段编制索引,并且会出现如下错误:

mapping set to strict, dynamic introduction of [hatae] within [data] is not allowed

如果要存储数据,但使字段无法索引,可以采用如下设置:

PUT http://localhost:9200/test_idx/_mapping/test_type
{
  "dynamic":false
}

希望这些能帮助有同样问题的人:)。

归德厚
2023-03-14

就快到了:需要将值设置为严格。正确的用法如下:

PUT /test_idx
{
  "mappings": {
    "test_type": {
      "dynamic":"strict",
      "properties": {
        "field1": {
          "type": "string"
        }
      }
    }
  }
}

再进一步,如果你想禁止创建新类型,而不仅仅是索引中的字段,请使用以下命令:

PUT /test_idx
{
  "mappings": {
    "_default_": {
      "dynamic": "strict"
    },
    "test_type": {
      "properties": {
        "field1": {
          "type": "string"
        }
      }
    }
  }
}

没有\u默认值模板:

PUT /test_idx
{
  "settings": {
    "index.mapper.dynamic": false
  },
  "mappings": {
    "test_type": {
      "dynamic": "strict",
      "properties": {
        "field1": {
          "type": "string"
        }
      }
    }
  }
}
 类似资料:
  • 问题内容: 我正在尝试仅针对特定索引而不是对所有索引禁用动态映射创建。由于某种原因,我无法将 默认 映射与’dynamic’:’false’ 放在一起。因此,在这里我看到了两个选项: 指定属性 “index.mapper.dynamic” 文件 elasticsearch.yml 。 将 “ index.mapper.dynamic” 放在索引创建时,如此处https://www.elastic.

  • 问题所在 我是elasticsearch的新手,我想了解动态映射和重新索引文档之间的关系。 根据我的实验,当动态映射打开时,文档的重新索引是自动完成的。这意味着如果向文档中添加新字段,它将自动被索引。 TEST1-带映射的索引 TEST2-没有映射的索引

  • 问题内容: 我正在努力完成索引创建这一简单任务,目标是使用分析器和字段映射创建索引。当我使用分析器创建索引时,我可以通过分析api调用与分析器通信,但是当我添加映射信息时,创建索引调用失败,并显示“字段[$ field]]找不到Analyzer [analyzer1]”,我创建了一个脚本来显示问题: 问题答案: 我相信您的问题是这些设置需要嵌套在JSON的一个节点内,而不是您所拥有的嵌套在一个节点

  • 问题内容: 也许我缺少一些简单的东西,但仍然无法弄清楚以下内容: 从ES 6.x开始,该字段已弃用,建议使用说明(https://www.elastic.co/guide/en/elasticsearch/reference/current/copy- to.html )。 但是,给我的印象是,您需要显式指定要复制到自定义字段的字段。但是,如果我使用动态映射,则我不事先知道字段,因此不能使用? 我

  • 我正在尝试禁用弹性搜索索引的动态映射器。下面是我通过Kibana控制台进行测试的一系列查询。 我想添加“index.mapper.dynamic”应该会在索引级别禁用它,对吧? 但是最终的GET返回这个文档,注意是我添加到posted文档中的一个字段,只是为了测试--它不应该在结果中。我还检查了映射,它被动态添加到映射中。 我的创建索引查询有什么问题?? 搜索查询

  • 问题内容: 我有一个要在elasticSearch上建立索引的文档,该文档包含一些我事先不知道的动态键,例如下面的示例中的“ spanish”或“ french” 我使用的是DSL elastic4s为了使我的映射(通过在DSL的createIndex),但我找不到如何创建,使用这个库的基础上,“匹配”选项动态映射(如建议在这里),在为了为路径content.title下存储的每种语言指定不同的分