【发布时间】:2018-05-16 17:34:23
【问题描述】:
我打算使用 Elasticsearch 设计一个多租户搜索平台。一种选择是共享索引跨租户。但问题是,同一索引中不同租户的文档可能会影响结果的评分,因为评分的 IDF 部分是针对一个索引中的所有文档计算的。 有没有办法让ES根据过滤后的文档计算IDF?例如,按租户过滤文档,使一个租户的文档不会影响同一索引中另一个租户的文档得分。
【问题讨论】:
标签: elasticsearch
我打算使用 Elasticsearch 设计一个多租户搜索平台。一种选择是共享索引跨租户。但问题是,同一索引中不同租户的文档可能会影响结果的评分,因为评分的 IDF 部分是针对一个索引中的所有文档计算的。 有没有办法让ES根据过滤后的文档计算IDF?例如,按租户过滤文档,使一个租户的文档不会影响同一索引中另一个租户的文档得分。
【问题讨论】:
标签: elasticsearch
根据search_type=dfs_query_then_fetch 参数,没有内置方法可以根据某些内容而不是索引(或分片)中的文档来计算 IDF。
你有什么选择:
实现自定义相似度,它将以您需要的方式计算 IDF(不确定它是否足够高效,还需要自定义代码 + 自定义部署)
单独的索引
使用_routing 字段将租户 X 的文档路由到分片 X,同时将租户 Y 文档路由到分片 Y。有关此方法的更多信息 - https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-routing-field.html。稍后,不要使用全局 IDF,而是使用本地 IDF(默认参数),它应该可以解决问题。问题是——你对这个的控制真的很有限——每个租户只有一个分片,这使得以后无法正确扩展。
【讨论】: