Lucene.net Lucene索引:按帐户共享还是隔离?

Lucene.net Lucene索引:按帐户共享还是隔离?,lucene.net,lucene,Lucene.net,Lucene,我正在评估Lucene在SaaS应用程序中实现全局搜索功能 我们不希望用户看到其他帐户的内容,因此搜索将始终受到帐户的限制 使用一个带有帐户id字段的单一索引还是每个帐户一个索引更好?每种方法的优缺点是什么 我担心的是,由于频繁更新,全局索引可能会影响性能 多谢各位 编辑 估计文件总数:5000000 帐户数目:4000 可索引数据从不在帐户之间共享 帐户用户可能每天更新其可索引数据数次(大多数情况下不超过100次) 在初始设置过程之后,索引数据量趋于稳定 我们需要为每个文档存储10-20个字

我正在评估Lucene在SaaS应用程序中实现全局搜索功能

我们不希望用户看到其他帐户的内容,因此搜索将始终受到帐户的限制

使用一个带有帐户id字段的单一索引还是每个帐户一个索引更好?每种方法的优缺点是什么

我担心的是,由于频繁更新,全局索引可能会影响性能

多谢各位

编辑

  • 估计文件总数:5000000
  • 帐户数目:4000
  • 可索引数据从不在帐户之间共享
  • 帐户用户可能每天更新其可索引数据数次(大多数情况下不超过100次)
  • 在初始设置过程之后,索引数据量趋于稳定
  • 我们需要为每个文档存储10-20个字段

    • 如果是我,如果没有监管部门的理由,你不能,我会把它们全部放在一个索引中。这就是我的“不要优化你不需要的”帽子

      第一个问题是简单的法律问题:您甚至可以共同托管和混合数据,即使数据是通过逻辑方式分离的。这取决于您的律师、客户和服务协议。这不是技术问题

      假设可以,那么下一个问题是其他用户会对彼此产生什么影响。如果用户A正在使用系统,而用户B正在导入其100K文档,这是否会影响用户A?它影响用户A是因为Lucene的工作方式,还是仅仅因为导入和索引文档时发生的总体系统负载

      试试看

      关键是要确保您的客户机系统不会直接访问Lucene,而是通过某种外观访问。这个门面是实施客户机隔离的完美场所,如果您以后决定需要切分索引,它也是重定向流量的好地方

      也许你需要删除一个重用户。或者你向那些在SLA中保证有更多资源的人推销更高级别的响应时间,等等

      但现在,我们要决定哪条路更好?呃,似乎还早


      对于Lucene来说,500K文档不是很多数据。只要确保在实现中具有灵活性,以便在以后发现将所有功能托管在单个实例中不可行时添加功能。我所说的“添加功能”就是指,添加它。不要实际实现,比如说,基于客户端的切分。但是,我有一个很好的观点,即它可以在以后无需重做一堆管道的情况下实现。

      除了常见的问题(例如索引更新等)之外,我还可以考虑以下几点:

    • lucene返回排名结果的方式取决于一些“语料库范围”的统计数据,例如某个术语在该字段中出现的文档总数。因此,如果客户a的索引统计数据不适用于客户b,那么除了存在安全风险之外,它还会损害两个客户的相关性。。。如果oscar足够聪明,他真的可以开始反转bob的文档,因为反向索引的性质:您可能可以使用类似以下排序算法的方法来解决此问题:
    • lucene中的其他一些东西适用于“作为一个整体的字段”或“作为一个整体的索引”,您应该知道,如果您将索引分组在一起,它们就不能在每个客户的基础上进行真正的更改:例如ommittf(如果您为一个字段在单个文档上设置它,则该字段将被完全忽略)、相似性(在lucene的任何发布版本中,您只能全面设置相似度,因此客户无法调整排名模型)、拼写检查(您必须修改一些内容,每个客户都有自己的“过滤”拼写检查索引)
    • 另一方面,如果您有许多术语,则需要相当多的RAM,并且通过为每个客户提供自己的索引,您将需要更多的内存来保存所有索引的RAM中的术语索引。但是,您可以通过调整termIndexInterval/除数之类的内容来降低这一点
    • 我在这里和那里做了一些“安全性修剪”索引——如果允许的话,这是绝对可能的。也就是说,我对多个客户端的SAAS类型的东西的总体倾向是尽可能地分离客户端,原因如下:

      a) 确保编码错误不会导致数据泄漏、愤怒的客户、诉讼和其他胡闹。
      b) 使每个客户端的定制更加容易--您的整个代码库不需要处理特定于客户端的fubar请求
      c) 从第一天起,您就必须进入一个水平可扩展的体系结构——如果添加实例很容易,那么扩展就很容易,对吗


      哦,当然要接受威尔·哈东的建议——门面搜索,那些东西真的不应该从它的层面爬出来。

      你的问题太宽泛/复杂;答案在很大程度上取决于应用程序及其体系结构的其他方面。查询索引的运行环境是什么?可索引数据是否经常在多个帐户之间共享?数据是否经常更新?多久?典型账户的索引数据增长率是多少?等等。关于1中提到的论文,可以使用自定义搜索过滤器实现第二种方法(查询集成)吗?除非您对IDF做些什么。。。对于lucene来说,最简单的解决方案是使用过滤器+一个根本不使用任何全局统计数据的相似性。