elasticsearch中的可编辑文档字段

时间:2016-02-16 14:45:47

标签: node.js elasticsearch

我的文档包含一个可在运行时编辑属性(添加/删除/编辑)的对象。

{
  "testIndex" : {
    "mappings" : {
      "documentTest" : {
        "properties" : {
          "typeTestId" : {
            "type" : "string",
            "index" : "not_analyzed"
          },
          "createdDate" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "designation" : {
            "type" : "string",
            "fields" : {
              "raw" : {
                "type" : "string",
                "index" : "not_analyzed"
              }
            }
          },
          "id" : {
            "type" : "string",
            "index" : "not_analyzed"
          },
          "modifiedDate" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "stuff" : {
            "type" : "string"
          },
          "suggest" : {
            "type" : "completion",
            "analyzer" : "simple",
            "payloads" : true,
            "preserve_separators" : true,
            "preserve_position_increments" : true,
            "max_input_length" : 50,
            "context" : {
              "typeTestId" : {
                "type" : "category",
                "path" : "typeTestId",
                "default" : [ ]
              }
            }
          },
          "values" : {
            "properties" : {
              "Att1" : {
                "type" : "string"
              },
              "att2" : {
                "type" : "string"
              },
              "att400" : {
                "type" : "date",
                "format" : "dateOptionalTime"
              }
            }
          }
        }
      }
    }
  }
}

字段值是一个可以通过typeTest编辑的对象,所以如果我在typeTestit中更改某些东西,应该在这里反映出来。如果我创建一个新字段没有问题,但应该可以编辑或删除typeTest中的现有字段。例如,如果我删除values.att1,则所有documentTest都应丢失这些,并且应该更新映射。

对于我所看到的,如果没有重新索引,我们就无法做到这一点。所以现在我的解决方案是删除弹性搜索中的字段,就像提到in this question一样,让工作人员在需要时不时地重新编制索引。

这似乎不是我的解决方案"。有没有更好的方法在elasticsearch中拥有此类型的文档?具有这种灵活性而无需不时重新索引?

1 个答案:

答案 0 :(得分:1)

您可以使用Update API删除,添加或修改字段 问题是文档在elasticsearch中是不可变的,因此当您使用更新API进行一些更改时,它将以mark as deleted to old one and add a new one with the updates的方式执行。
删除和创建新文档对您来说是透明的,因此您不必重新编制索引或执行任何其他操作。如果您打算修改大量文档(例如更新查询以修改5mil文档),则可能会出现问题。对于节点来说,这将非常耗费I / O.
顺便说一下,这也适用于删除