elasticsearch 如何设计ElasticSearch索引,elasticsearch,elasticsearch" /> elasticsearch 如何设计ElasticSearch索引,elasticsearch,elasticsearch" />

elasticsearch 如何设计ElasticSearch索引

elasticsearch 如何设计ElasticSearch索引,elasticsearch,elasticsearch,我有一个具有多种类型的文档存储。每种文档类型都有一些基本元数据,比如uuid,以及一个单独的“实体”字段,其中包含一个字符串化的json和实际内容。这是因为文档虽然有类型,但没有严格的模式,任何用户都可以提供任何结构的数据 我需要能够浏览,过滤和搜索通过这些文件,所以我将把他们放入ElasticSearch 我的问题是:我应该如何构建ES?我读到过,索引太多对ES不好,最好是索引尽可能少。但是ES也不喜欢相同类型的文档是否具有不同的结构(映射)+您不能更改现有字段的映射,只能追加新字段的映射 每

我有一个具有多种类型的文档存储。每种文档类型都有一些基本元数据,比如uuid,以及一个单独的“实体”字段,其中包含一个字符串化的json和实际内容。这是因为文档虽然有类型,但没有严格的模式,任何用户都可以提供任何结构的数据

我需要能够浏览,过滤和搜索通过这些文件,所以我将把他们放入ElasticSearch

我的问题是:我应该如何构建ES?我读到过,索引太多对ES不好,最好是索引尽可能少。但是ES也不喜欢相同类型的文档是否具有不同的结构(映射)+您不能更改现有字段的映射,只能追加新字段的映射

每个文档类型和用户的“模式”都是固定的,因此我可以为每个用户创建具有相同类型的新索引,但正如我所提到的,拥有大量索引是不好的

那么,在这种情况下,推荐的设计是什么

这听起来可能很疯狂,但将文档解析为键/值格式(其中键是属性路径)是否可行?我在这里看到的唯一问题是,所有内容都必须设置为全文,这听起来不是一个好主意


编辑:似乎ES自己可以做到这一点,但我仍然不确定该怎么做。

您可以做的是使用
字段嵌套
对象类型数组,即您的映射看起来像

"entity": {
   "type": "nested",
   "properties": {
      "key": {
        "type": "keyword"
      },
      "value": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
   }
}
例如,通过这种方式,您可以在
entity
字段中存储几乎任何您想要的内容,而无需冒映射类型爆炸的风险

{
   "uuid": "",
   "entity": [
     {"key": "myfield1", "value": "Some value"},
     {"key": "myfield2", "value": "Some value"},
     {"key": "myfield3", "value": "Some value"}
   ]
}

然后,您必须确保在查询数据时使用
嵌套的
查询,但这绝对是可行的。

您能展示一些您希望存储的相关文档样本吗?这与文档本身无关,而是与不可预测的模式以及如何进行索引有关。是的,这就是我在问题中所描述的,缺点是固定字段类型不利于过滤。为什么这样不好?通过一系列嵌套查询,您可以实现它。可以显示一个要运行的示例查询吗?如果所有值都是全文,则无法执行date/int/。。范围查询或诸如此类的事情(正确地说)。好吧,总是有一个折衷。。。俗话说,如果你让垃圾进来,你就把垃圾拿出来;-)但我仍然有兴趣看到您拥有的具体数据和您希望对其执行的查询。没有数据。我目前正在设计架构。我的用例是“产品”对象。每个客户都有自己的“应用程序”,每个“应用程序”都有一个“产品”实体。每个“产品”可以有不同的字段“捆绑包”——想象一下产品类型。所有“产品”都作为文档存储在中心SPOT存储库中,我需要提供对这些文档的搜索和筛选。