每个用户的索引或所有用户的索引(不同的架构)?

时间:2016-04-18 09:55:24

标签: elasticsearch

我一直在听大家说最好为所有用户共享相同的索引而不是每个用户的索引。所以每个用户都会使用别名。

从那时起,我一直认为这是最好的解决方案,原因有几个。然而,这让我想起你帮助我解决下一个局面的情况。

ES是无模式存储引擎。好吧,没问题,一切都可以,直到几个用户能够构建他们的架构。

例如,假设一个软件产品允许用户标记他/她的文档,并且每个标记都有一个名称和类型。因此,用户说我想使用project类型的标记string来标记我的文档。同样,另一个用户可能使用类型为project的标记number标记他/她的文档标记它们然后ES可以使用此标记索引文档,在名称标签名称类型为字符串的集合上创建字段/ number ...(我的服务器应用程序将使用这个新字段序列化文档)。

User1:
{ 
   "name": ""
   "department": ""
   "project": "xxx"   <<<<<<<<<<<<<<<<<
}

User2:
{ 
   "name": ""
   "department": ""
   "project": 1000   <<<<<<<<<<<<<<<<<
}

所以,我的意思是每个用户都可以拥有他/她自己的架构。

我想问你能为我提供一种方法,只为所有用户使用一个索引,或者为每个用户使用索引。

我要说的是,大多数架构对所有用户来说都是类似的。因此,所有用户共享最初提供的架构的95%,然而,每个用户将能够添加新的架构字段......

我希望我解释得很好。

2 个答案:

答案 0 :(得分:0)

如果您的用户能够创建自己的字段(具有相同的名称但可能具有不同的类型,即字符串与整数),则每个用户最好有一个索引,否则如果您正在使用,则会遇到问题ES 2.0或更高版本。

具体地说,从ES 2.0开始,在同一索引is not allowed的两种不同映射类型中有两个具有相同名称但设置不同的字段(diff类型,差异分析器等)。

答案 1 :(得分:0)

除了Val的答案之外,我还是给你一些一般的建议:是的,考虑一下每个人的建议,但要小心,特别是如果以这样一般的方式给出。一般来说,良好做法可能仍然不适用或至少不适合特定情况。如果你有充分的理由不遵循良好的做法,那就这样做吧!

示例:我假设用户A不希望找到其他用户(B,C,...)的文档,只是因为它们符合用户A的搜索条件。如果ES 本身提供了适当的方法,那么全局索引会为您提供额外的工作以识别特定用户的标记(例如,禁止除字符串以外的任何标记类型,为每个标记值添加前缀使用用户名和分隔符 - 如果允许的话,可能必须在用户名中进行转义 - 并且始终使用此扩展名进行处理。在这种特定情况下,即使允许使用全局索引,每个用户使用索引也会更容易/更实用。