我正在设计一个多租户SaaS应用程序,租户将能够存储数据并对其进行搜索。我计划使用Lucene(实际上是Lucene.Net)作为搜索引擎。由于不需要跨租户搜索,我正在考虑为每个租户提供一个索引(所以一个目录)。
我不希望索引写入频繁发生,因此它们将排队到单个进程,该进程将打开索引,添加文档并在更新到达时关闭索引。
我想在阅读上有更高效的东西。租户数量可能从数百万到数万,因此在每个搜索节点上保持所有目录在RAM中打开是不明智的。我正在考虑管理最近使用或最常用目录的候选名单,定期关闭那些超出标准的目录。
我对Lucene一般都很陌生,所以会对这个策略提出一些反馈意见。
由于
答案 0 :(得分:3)
除了您提到的策略之外,您还可以考虑为所有客户端设置单个索引,并将正确的客户端查询与所有用户查询进行对比,以确保每个客户端只获取自己的数据:
TermQuery clientQuery = new TermQuery(new Term(“clientid”,clientid));
BooleanQuery query = new BooleanQuery();
query.add(userQuery,BooleanClause.Occur.MUST);
query.add(clientQuery,BooleanClause.Occur.MUST);
如果你有很多租户并且他们的索引平均很小/略微使用,这可能会更好。然后,如果您的数据具有时间轴,则可能存在扭曲,您还可以将此大索引划分为年度,月度或每日块。因此,通常会更频繁地使用最新的,并且您可以更好地缓存操作系统,减少内存使用等。
答案 1 :(得分:2)
请注意我的个人经历。
我们还制作了一个多租户应用,我们选择每个租户拥有一个索引(一个目录)。 原因是使每个租户的备份/隔离更加容易。
表现很好,但我确信柿子是正确的:有几个小指数不如一个小指数有效。但是你需要进行测试才能了解它的含义。