多租户 Lucene 索引策略

Tho*_*iss 5 lucene lucene.net

我正在设计一个多租户 SaaS 应用程序,租户将能够在其中存储数据并对其执行搜索。我打算使用 Lucene(实际上是 Lucene.Net)作为搜索引擎。由于不需要跨租户搜索,我正在考虑为每个租户设置一个索引(即一个目录)。

我不希望索引写入非常频繁,因此它们将排队到一个进程中,该进程将打开索引、添加文档并在更新到达时关闭索引。

不过,我希望在读取上有一些更有效的东西。租户的数量可能从数百到数万不等,因此在每个搜索节点的 RAM 中保持所有目录打开是不明智的。我正在考虑管理最近使用或最常用的目录的候选名单,定期关闭那些不符合标准的目录。

总的来说,我对 Lucene 真的很陌生,所以希望能得到一些关于该策略的反馈。

谢谢

Per*_*ium 4

除了您提到的策略之外,您还可以考虑为所有客户端使用单个索引,并将正确的客户端查询与所有用户查询进行“与”操作,以确保每个用户只获取自己的数据:

TermQuery clientQuery = new TermQuery(new Term("clientid",clientid));

BooleanQuery 查询 = new BooleanQuery();

query.add(userQuery,BooleanClause.Occur.MUST);

query.add(clientQuery,BooleanClause.Occur.MUST);

如果您有很多租户,并且他们的索引平均较小/很少使用,那么这可能会更好。然后,可能会有一个转折,如果您的数据有时间轴,您还可以将这个大索引划分为每年、每月或每天的块。因此,通常最新的版本会更频繁地使用,并且您可以获得更好的操作系统缓存、更少的内存使用等。