休眠搜索动态映射

时间:2018-07-27 20:44:18

标签: elasticsearch hibernate-search

我正在尝试通过使用hibernate-search弹性搜索集成与hibernate一起使用弹性搜索。我有使用区分策略的多租户数据,因此最好为索引实体添加自动添加的租户标识符。到目前为止,这似乎可行:

Session session = sessionFactory
                          .withOptions()
                            .tenantIdentifier("parkId-" + p.getId().toString())
                          .openSession();

但是,在索引过程中,弹性搜索由于strict_dynamic_mapping_exception而抱怨:

Response: 
{
  "index": {
    "_index": "entities.productmodel",
    "_type": "entities.ProductModel",
    "_id": "parkId-1_29426",
    "status": 400,
    "error": {
      "type": "strict_dynamic_mapping_exception",
      "reason": "mapping set to strict, dynamic introduction of [__HSearch_TenantId] within [entities.ProductModel] is not allowed"
    }
  }
}

这完全是 的事实,我覆盖了休眠搜索的默认行为,并将动态映射设置为true,如docs所示:

configuration.setProperty("hibernate.search.default.elasticsearch.dynamic_mapping", "true");

(通过此方法可以正确设置其他设置,所以我知道这不是问题。)

知道我缺少什么吗?即使将dynamic_mapping设置为false也不会导致更改-弹性搜索仍然会抱怨映射设置为严格。我的弹性搜索集群通过docker在本地运行。

2 个答案:

答案 0 :(得分:1)

在进行每次开发之前,请确保重新生成架构。您不需要为此设置dynamic_mapping,但是如果您在尝试添加多租户之前生成了架构,并且之后又没有更新架构,则会遇到类似这样的错误。

只需将索引放在您的Elasticsearch集群中,或将属性hibernate.search.default.elasticsearch.index_schema_management_strategy设置为drop-and-create不用于生产,您将丢失所有索引数据)。有关架构生成的更多信息,请参见this section of the documentation

答案 1 :(得分:0)

如果您在ORM配置中设置了hibernate.multiTenancy,则租户ID字段应为架构的一部分。

你吗?

如果是这样,我们可能在某个地方存在错误,并且测试用例会有所帮助。这里有一个测试用例模板:https://github.com/hibernate/hibernate-test-case-templates/tree/master/search/hibernate-search-elasticsearch/hibernate-search-elasticsearch-5