Elasticsearch 是否有内置函数来防止在指定条件下索引文档?

Is there any built-in function from Elasticsearch to prevent indexing document on specified condition?

我正在实施使用 Elasticsearch 的多租户系统。 单个索引保存所有租户文档。因为它对所有租户都有相同的字段。 我有一个字段可以像这样识别租户。

{
  tenantId: "cba1714d-0062-4fc6-a11d-88e062b1fe88"
}

条件是此租户 ID 中的用户只能索引租户 ID == "cba1714d-0062-4fc6-a11d-88e062b1fe88" 的文档。

是否有内置功能防止跨租户索引文档?

是的,您可以使用 ingest pipeline in elasticsearch. Ingest pipeline have drop processor 实现,它将根据特定条件删除文档。

您可以使用以下命令或从 Kibana 创建摄取管道。

PUT _ingest/pipeline/my-pipeline
{
  "description": "My optional pipeline description",
  "processors": [
    {
      "drop": {
        "if": "ctx.tenantId != 'cba1714d-0062-4fc6-a11d-88e062b1fe88'"
      }
    }
  ]
}

创建管道后,您可以在索引请求中提供管道名称:

POST my-index/_doc?pipeline=my-pipeline
{
  "@timestamp": "2099-03-07T11:04:05.000Z",
  "tenantId": "cba1714d-0062-4fc6-a11d-88e062b1fe88"
}

如果您想在不同索引中基于 tenantId 索引文档,那么您可以使用 Set Processor 并根据条件更改 _index 的值。