我将使用Elasticsearch设计一个多租户搜索平台。一种选择是共享索引交叉租户。但问题是,同一索引中不同租户的文档可能会影响结果的评分,因为评分的IDF部分是在一个索引中的所有文档中计算的。 有没有办法让ES根据过滤的文件计算IDF?例如,按租户过滤文档,以便一个租户的文档不会影响同一索引中另一个租户的文档得分。
答案 0 :(得分:0)
根据search_type=dfs_query_then_fetch
param,没有内置的方法可以根据某些内容计算IDF,而不是索引(或分片)中的文档。
您有哪些选择:
实施自定义相似性,将以您需要的方式计算IDF(不确定它是否足够高效,还需要自定义代码+自定义部署)
单独的指数
将租户X的文档路由到碎片X,同时使用_routing
字段将租户Y文档路由到碎片Y.有关此方法的更多信息 - https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-routing-field.html。之后,不要使用全局IDF,而是使用本地IDF(默认参数),它应该可以解决问题。问题是 - 你对这个只有非常有限的控制 - 每个租户只有一个分片,这使得以后无法正确扩展。