具有spring-data-elasticsearch的多租户

时间:2014-03-14 10:20:36

标签: elasticsearch spring-data spring-data-elasticsearch

有没有办法让spring-data-elasticsearch适用于多租户应用?

我已经让它在没有多租户的情况下工作,但我不知道如何为每个租户提供多个索引或多个节点?我想知道是否有任何方法可以为每个租户定义不同的索引名称,或者在我的实体类中添加瞬态属性,该属性使用@Document(...)正确注释。当我试图解决这个问题时,@Transient也标记为ElasticSearchRepository。 有什么想法吗?

4 个答案:

答案 0 :(得分:4)

这是我对这个问题的解决方案。默认情况下,我们会添加一个带有@Document POJO注释的索引,这是可以的。但是在某些情况下我们希望每个客户端都有不同的索引,所以我决定自己创建它们。我使用ElasticSearch模板为不同的租户创建索引,而不是依赖Spring Data ElasticSearch repo进行保存。这就是我做的事情

    IndexQuery indexQuery = new IndexQueryBuilder()
                        .withId("ID")
                        .withIndexName("yourtenant")
                        .withType("yourtype")
                        .withObject(obj)
                        .build();

    es.index(indexQuery)

答案 1 :(得分:3)

首先,您必须了解Elasticsearch(尤其是Lucene)如何存储您的数据。

Elasticsearch的命名约定“index”和“type”有点误导,很可能你最初的想法!

如果在Elasticsearch中的索引中创建类型(id, field1, field2),它将创建类似于SQL表的内容:

id     | field1 | field2
-------------------------
string | int    | boolean

您可能期望的是,当您向该索引添加第二种类型(id, type2field)时会发生什么。索引映射将变为:

id     | field1 | field2  | type2field
--------------------------------------
string | int    | boolean | string

这种情况发生了,因为有没有类型的映射 - 即使Elasticsearch会使它看起来像那样。 在索引级别只有一个映射!这样,您很可能最终会有很多空字段。

虽然一般情况下,特别是对于多功能设置,您应该为每个类创建一个索引 - 不是类型!您应该使用该类型来分隔类似形状的数据,即您的租户使用类型。或者在地图中添加一个额外的字段以识别租户。

在此处详细了解:https://www.elastic.co/guide/en/elasticsearch/guide/current/mapping.html#_type_takeaways

答案 2 :(得分:2)

我已经解决了这个问题。它可能不是最好的解决方案,但我没有找到其他任何东西。 我已将字段tenantName添加到我的索引类中,并使用注释@javax.persistence.Transient而不是@org.springframework.data.annotation.Transient对其进行标记。之后,我正在进行搜索查询,条件是租户必须是当前用户所属的租户。

答案 3 :(得分:0)

我找到了一个很简单的解决方案,使用SpEL为

等索引添加前缀
      46.42    0.00    5.87    6.87    0.00   40.83

@Document(indexName = "#{@prefixProvider.getPrefix()}_foo", type="bar") 只是一个普通的春天豆。