2011-04-25 53 views
4

我正在评估Lucene在SaaS应用程序中实现全局搜索功能。Lucene索引:共享或帐户隔离?

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

使用帐户ID字段或每个帐户一个索引有单一索引是更好吗?每种方法的优点和缺点是什么?

我担心全局索引可能会因频繁更新而影响性能。

谢谢。

编辑

  • 估计数量总文件:500,0000
  • 帐户数量:4000
  • 可转位数据永远不会之间共享占
  • 帐户用户可以更新他们的可转位数据每天数次(大多数情况下不超过100次)
  • 索引数据量在初始设置后趋于稳定过程
  • 我们需要保存每个文档
+0

您的问题太宽泛/复杂;答案很大程度上取决于您的应用程序及其架构的其他方面。什么是查询索引的运行环境?可索引数据经常在许多帐户之间共享?数据是否经常更新?多久?一个典型账户的索引数据的增长率是多少?等等等等。 – 2011-04-25 22:09:36

回答

2

这里有一些事情我曾经想,除了常见的问题(如索引更新和等):

  1. Lucene的回报率排名的方式结果取决于一些“语料库宽”的统计数据,例如该字段出现的文档总数。因此,如果客户a的指数统计不适合客户b,那么它将损害两个客户的相关性,除了存在安全风险外......如果奥斯卡足够聪明,他真的可以开始颠倒鲍勃的文件,因为倒排索引:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.159.9682你可以用这个排名算法解决这个问题:https://issues.apache.org/jira/browse/LUCENE-2864
  2. lucene中的其他一些东西适用于“整个领域”或“索引作为一个整体”,你应该知道他们可以'如果您将索引组合在一起,那么实际上可以根据每个客户进行更改:omitTF(如果您将其设置为单个文档中的某个字段,则将其忽略),相似性(任何已发布的lucene ,你只能在整个板子上设置相似度,所以客户将无法调整排名模型),拼写检查(你必须破解一些东西每个客户都有自己的“过滤”拼写检查索引),...
  3. 另一方面,如果您有很多条款,需要相当多的内存,通过给每个客户自己的索引,对于所有的索引,需要更多的内存来保存RAM中的术语索引。但是,您可以通过调整termIndexInterval/Divisor等来降低这一点。
+0

关于1中提到的论文,是否可以说使用自定义搜索过滤器来实现他们的第二种方法(查询集成)是正确的? – 2011-04-26 01:59:05

+0

除非您对IDF做些什么......对于lucene来说,最简单的解决方案是使用过滤器+相似性,根本不使用任何全局统计信息。 – 2011-04-26 02:20:15

1

我已经在这里和那里做了一些“安全修剪”索引 - 如果允许的话,绝对有可能。也就是说,对于有多个客户端的SAAS类型的东西,我的一般倾向是尽可能多地分离客户端,原因如下:

a)确保编码错误不会导致数据泄露,愤怒的客户端,诉讼和其他胡哈哈。
b)使每个客户端的定制变得更容易 - 你的整个代码库不需要处理客户特定的fubar请求
c)从第一天开始就强制你进入水平可伸缩的架构 - 如果添加实例很容易,对?

哦,绝对采取Will Hartung的建议 - 立面搜索,那些东西真的不应该爬出它的层。