使用spring-data-elasticsearch实现多租户功能。

8
有没有办法让spring-data-elasticsearch适用于多租户应用程序?
我已经成功实现了单一租户的功能,但我不知道如何为每个租户定义多个索引或多个节点?我想知道是否有任何方法可以为每个租户定义不同的索引名称,或者在我的实体类中添加过渡属性,这些属性已经正确注释了@Document(...)。当我尝试去做时,出现问题,因为@Transient也被标记在ElasticSearchRepository中。
有什么建议吗?

请问您能否详细说明一下?当您说多租户时,是指在多个索引上进行搜索吗? - Mohsin Husen
是的,我希望为每个租户拥有多个索引。使用spring-data-elasticsearch,我没有找到任何解决方案。因此,任何其他解决方案,如多个节点或其他适当的解决方案,都可以适用于我。 - miroslav_mijajlovic
你想要在单节点架构中配置Elasticsearch,以支持同时多个用户访问,还是使用多节点架构? - BlackPOP
单节点架构,多租户。 - miroslav_mijajlovic
4个回答

4
这是我为解决此问题所做的方案。默认情况下,我们会在POJO注释中添加一个索引@Document,这很好。但是,在某些情况下,我们希望每个客户端都有不同的索引,因此我决定自己创建它们。我使用了ElasticSearch模板来为不同的租户创建索引,而不是依赖于Spring Data ElasticSearch存储库进行保存。以下是我的做法。
    IndexQuery indexQuery = new IndexQueryBuilder()
                        .withId("ID")
                        .withIndexName("yourtenant")
                        .withType("yourtype")
                        .withObject(obj)
                        .build();

    es.index(indexQuery)

Elasticsearch的第一戒律:“在类映射中不应使用'type'(在95%的情况下 - 例如继承和时间序列数据等有例外情况)。请参见下面的答案。” - Benjamin M

3

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

Elasticsearch的命名约定“索引”和“类型”有点误导,很可能不是您最初想到的那样!


如果您在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

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


1

我发现使用SpEL很容易地为索引添加前缀。

@Document(indexName = "#{@prefixProvider.getPrefix()}_foo", type="bar")

prefixProvider 是一个普通的 Spring Bean。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接