有没有办法让spring-data-elasticsearch适用于多租户应用?
我已经让它在没有多租户的情况下工作,但我不知道如何为每个租户提供多个索引或多个节点?我想知道是否有任何方法可以为每个租户定义不同的索引名称,或者在我的实体类中添加瞬态属性,该属性使用@Document(...)
正确注释。当我试图解决这个问题时,@Transient
也标记为ElasticSearchRepository
。
有什么想法吗?
答案 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")
只是一个普通的春天豆。