如何设计ElasticSearch索引

时间:2017-11-18 18:06:42

标签: elasticsearch

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

我需要能够浏览,过滤和搜索这些文档,以便将它们放入ElasticSearch。

我的问题是:我应该如何构建ES?我已经读过,索引太多并不适合ES,并且最好有尽可能少的索引。但ES也不喜欢相同类型的文档具有不同的结构(映射)+你不能改变现有字段的映射,只能附加新的字段。

“schema”对于每个文档类型和用户都是固定的,所以我可以为每个用户创建相同类型的新索引,但正如我所提到的,有很多索引是坏的。

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

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

编辑:似乎ES自己做https://www.elastic.co/guide/en/elasticsearch/reference/current/object.html,但我仍然不确定该怎么做。

1 个答案:

答案 0 :(得分:1)

您可以做的是拥有nestedkeyvalue"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"} ] } 字段中存储您想要的任何内容,而不会冒着映射类型爆炸的风险,例如

nested

然后,您在查询数据时必须确保使用{{1}}查询,但这绝对可行。