elasticsearch 您能在Elasticsearch中自动创建的索引中将字段设置为“未分析”吗?,elasticsearch,terraform,chalice,elasticsearch,Terraform,Chalice" /> elasticsearch 您能在Elasticsearch中自动创建的索引中将字段设置为“未分析”吗?,elasticsearch,terraform,chalice,elasticsearch,Terraform,Chalice" />

elasticsearch 您能在Elasticsearch中自动创建的索引中将字段设置为“未分析”吗?

elasticsearch 您能在Elasticsearch中自动创建的索引中将字段设置为“未分析”吗?,elasticsearch,terraform,chalice,elasticsearch,Terraform,Chalice,作为我们AWS基础设施的一部分,我正在使用Elasticsearch(7.4)索引。我们在AWS Elasticsearch中使用Terraform创建域,但没有显式创建索引。而是在发布第一个文档时,自动创建索引。这很有效,但现在我需要一个未分析的字段(用户id) 在放置第一个文档时,是否有方法使字段不被分析 如果有未分析,我可以选择哪些选项将字段设置为未分析?我应该做一些初始化/引导吗?也许有一种方法可以从地形上做到这一点。该应用程序是使用Chalice构建的,并在Lambda中运行。不确定在

作为我们AWS基础设施的一部分,我正在使用Elasticsearch(7.4)索引。我们在AWS Elasticsearch中使用Terraform创建域,但没有显式创建索引。而是在发布第一个文档时,自动创建索引。这很有效,但现在我需要一个未分析的字段(用户id)

在放置第一个文档时,是否有方法使字段
不被分析

如果有未分析,我可以选择哪些选项将字段设置为
未分析
?我应该做一些初始化/引导吗?也许有一种方法可以从地形上做到这一点。该应用程序是使用Chalice构建的,并在Lambda中运行。不确定在这种情况下如何在Lambda中进行初始化。理想情况下,我会一次性拨打此电话:

PUT /my_index
{
    "mappings" : {
          "properties" : {
              "user_id" : {
                  "type" : "string",
                  "index" : "not_analyzed" 
              }
          }
    }

}

重新启动应用程序时,将再次发送此呼叫,但我猜它是不可变的(PUT)。

这并不能直接回答您的问题,但对于您的问题,我建议使用Elasticsearch之外的解决方案:

  • 在Terraform中提供第二个Lambda函数,该函数允许对Elasticsearch运行PUT操作,其唯一目的是创建索引
  • 在Terraform中,创建域后调用此lambda函数

换句话说,执行问题中提到的引导,但将其移动到单独的lambda函数,而不是将其混合到应用程序lambda中。

这并不能直接回答您的问题,但对于您的问题,我建议使用Elasticsearch之外的解决方案:

  • 在Terraform中提供第二个Lambda函数,该函数允许对Elasticsearch运行PUT操作,其唯一目的是创建索引
  • 在Terraform中,创建域后调用此lambda函数

换句话说,执行你的问题中提到的自举,但是把它移到一个单独的lambda函数中,而不是把它混入你的应用程序lambda。

这可能是一个多余的问题,但是我会考虑使用< /P> 这看起来像

PUT _index_template/template_1
{
  "index_patterns": [
    "my_template*"
  ],
  "template": {
    "mappings": {
      "properties": {
        "user_id" : {
          "type" : "keyword"
        }
      }
    }
  },
  "priority": 1
}
它可以使用专用工具地形化,也可以使用IAM键直接与AWS Elasticsearch集成


然后,以这种方式创建的第一个文档也将使用给定模板(当然,如果名称与模式匹配)构建索引(

),这可能是一个过度的操作,但我会考虑使用

这看起来像

PUT _index_template/template_1
{
  "index_patterns": [
    "my_template*"
  ],
  "template": {
    "mappings": {
      "properties": {
        "user_id" : {
          "type" : "keyword"
        }
      }
    }
  },
  "priority": 1
}
它可以使用专用工具地形化,也可以使用IAM键直接与AWS Elasticsearch集成


然后,以这种方式创建的第一个文档也将使用给定的模板构建索引(当然,如果名称与模式匹配)

ES 7.x中不再有字符串类型。相反,对于未分析的字段,可以使用关键字。什么是为您创建映射?我想,当您通过发布第一个文档自动创建索引时,它将是默认映射。如果您使用的是v7.x,它将不是默认映射,因为它不再是受支持的类型。也许你还在5.x里?无论如何,请查看“动态模板”,它让您可以控制动态映射如何映射新数据。ES 7.x中不再有字符串类型。相反,对于未分析的字段,可以使用关键字。什么是为您创建映射?我想,当您通过发布第一个文档自动创建索引时,它将是默认映射。如果您使用的是v7.x,它将不是默认映射,因为它不再是受支持的类型。也许你还在5.x里?无论如何,请查看“动态模板”,它可以让您控制动态映射如何映射新数据。我明白了,但我可能只是找到一种方法,在安装完成后从Terraform执行HTTP PUT请求。一种方法是使用
localexec
provisioner。我明白了,但我可能只是找到一种方法在安装完成后从Terraform执行HTTP PUT请求。一种方法是使用
localexec
provisioner。非常好的建议,我刚刚尝试过。不幸的是,该功能是在7.8中添加的,AWS还不支持该功能(eu-west-1)。我会检查旧的方法来做同样的事情。@reikje模板在ES中已经存在很长时间了,至少从2.X版本开始就存在了。他们只是将其从
template
重命名为
index\u template
,这就是您在文档中找不到它的原因。请看这里:对于版本7.4,docsI使用了旧语法,谢谢。这是一个很好的建议,谢谢。我没有使用TF提供程序,因为它适用于0.13,我们仍然使用0.12。我只是创建了另一个Lambda,可以在terraform部署后手动运行。不是超级自动化,但足够好:)很好的建议,我刚刚试过。不幸的是,该功能是在7.8中添加的,AWS还不支持该功能(eu-west-1)。我会检查旧的方法来做同样的事情。@reikje模板在ES中已经存在很长时间了,至少从2.X版本开始就存在了。他们只是将其从
template
重命名为
index\u template
,这就是您在文档中找不到它的原因。请看这里:对于版本7.4,docsI使用了旧语法,谢谢。这是一个很好的建议,谢谢。我没有使用TF提供程序,因为它适用于0.13,我们仍然使用0.12。我只是创建了另一个Lambda,可以在terraform部署后手动运行。不是超级自动化,但足够好:)