Performance 对于重新搜索,创建单个索引还是多个索引更好?

Performance 对于重新搜索,创建单个索引还是多个索引更好?,performance,search,redis,redisearch,Performance,Search,Redis,Redisearch,我正在使用多租户应用程序构建索引,该应用程序具有: 15万租户 每个租户平均拥有3500名客户 每个客户有10个字段将添加到索引中 所有字段都是TextFields 问题是,在这种情况下,什么是最佳实践(性能、内存/存储、灵活性) 我应该创建一个带有tenant\u code字段的customer\u索引,以帮助识别哪些数据属于哪个租户,还是应该创建一个特定于租户的索引 根据我目前的经验和理解,特定于租户的索引将意味着许多索引,但其中包含的数据较少,这也将使我能够灵活地删除并重新创建特定租户

我正在使用多租户应用程序构建索引,该应用程序具有:

  • 15万租户
  • 每个租户平均拥有3500名客户
  • 每个客户有10个字段将添加到索引中
  • 所有字段都是
    TextFields
问题是,在这种情况下,什么是最佳实践(性能、内存/存储、灵活性)

我应该创建一个带有
tenant\u code
字段的
customer\u索引
,以帮助识别哪些数据属于哪个租户,还是应该创建一个特定于租户的索引

根据我目前的经验和理解,特定于租户的索引将意味着许多索引,但其中包含的数据较少,这也将使我能够灵活地删除并重新创建特定租户的索引

在Python中,代码如下所示:

单一客户指数

client = Client(`customer_index`)
client.create_index(
            [
                TextField('tenant_code'), TextField('last_name'), TextField('first_name'),
                TextField('other_name'), 
            ]
        )   
client = Client(`tenant_code_customer_index`)
client.create_index(
            [
                TextField('last_name'), TextField('first_name'), TextField('other_name'), 
            ]
        )
租户特定客户指数

client = Client(`customer_index`)
client.create_index(
            [
                TextField('tenant_code'), TextField('last_name'), TextField('first_name'),
                TextField('other_name'), 
            ]
        )   
client = Client(`tenant_code_customer_index`)
client.create_index(
            [
                TextField('last_name'), TextField('first_name'), TextField('other_name'), 
            ]
        )

因为每个租户只有3500个客户(相对较少),所以最好使用更大的索引。由于记录太少,每个索引的资源开销可能会超过索引本身的大小。这也会增加redis本身的键数,因为每个索引的每个索引项都会创建一个新的redis键。因此,如果您在每个数据库中有~2000个唯一项,那么最终将得到300M Redis密钥(2k*150k)。相比之下,使用单个索引将只剩下2k个键

就性能而言,也不应该有任何区别,因为租户代码本身就是一个反向索引,所以搜索不太可能需要在更大的索引中筛选更多的记录

对于删除,您只需收集符合条件的ID列表,例如“
FT.SEARCH idx@tenant:yourcode
”,然后分别对这些记录调用
FT.DEL
。我假设这不是每五秒钟执行一次的操作,所以您应该在那里


请注意,现在使用150k索引甚至可能是不可能的,因为为每个索引创建了一个专用的索引线程(尽管在将来的版本中将提供在单个线程上执行索引的选项)。

谢谢。很有见地。索引的重新生成将每月进行一次。所以是的,我在那里应该很安全。问题是。当你说的相对较少时,什么可以定义为较多?Redisearch在市场上相对较新(与Elasticsearch等相比),因此没有太多的战斗故事来帮助衡量,我也没有在Redislabs的非技术文档中看到太多。Redisearch处理的关键“货币”是(1)术语和(2)文档。是否有一个“小”或“很多”很大程度上取决于你的索引中有多少个。例如,如果每个文档只包含几个字节,则2M文档的数量可能相当小,但如果每个文档的长度为几MB,则可能意味着数据库更重。