【问题标题】:hibernate search for elasticsearch with JPA can not auto create index when jpa create an entity当jpa创建实体时,使用JPA对elasticsearch进行休眠搜索无法自动创建索引
【发布时间】:2017-02-07 10:02:49
【问题描述】:

我正在使用 hibernate-search-elasticsearch,hibernate 文档告诉我们 当我们使用 jpa 创建实体时,会自动创建索引。我发现我的程序成功创建实体,但没有创建索引。

为了使用hibernate-search和es,我导入了hibernate-search-elasticsearch jar

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-search-elasticsearch</artifactId>
    <version>5.6.0.Final</version>
</dependency>

persistence.xml

<persistence-unit name="dev_unit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <mapping-file>META-INF/travel-service/orm.xml</mapping-file>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL57InnoDBDialect" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="false" />
        <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />

        <!--Hibernate JPA-->
        <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"/>
        <property name="hibernate.cache.use_second_level_cache" value="false" />
        <property name="hibernate.cache.use_query_cache" value="false" />

        <property name="hibernate.connection.provider_class"
                  value="org.hibernate.hikaricp.internal.HikariCPConnectionProvider" />
        <property name="hibernate.hikari.dataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" />
        <property name="hibernate.hikari.minimumIdle" value="5" />
        <property name="hibernate.hikari.maximumPoolSize" value="10" />
        <property name="hibernate.hikari.idleTimeout" value="30000" />
        <property name="hibernate.hikari.dataSource.url" value="jdbc:mysql://127.0.0.1:3306/travel?useUnicode=true&amp;charset=utf8mb4amp;autoReconnect=true" />
        <property name="hibernate.hikari.dataSource.user" value="root" />
        <property name="hibernate.hikari.dataSource.password" value="111111" />

        <!-- search -->
        <property name="hibernate.search.default.directory_provider" value="filesystem"/>
        <property name="hibernate.search.default.indexBase" value="/Users/yybbk/index"/>
        <property name="hibernate.search.elasticsearch.host" value="http://localhost:9200" />
        <property name="hibernate.search.default.indexmanager" value="elasticsearch"/>
        <property name="hibernate.search.default.elasticsearch.required_index_status" value="yellow"/>
        <property name="hibernate.search.default.elasticsearch.index_schema_management_strategy" value="CREATE"/>
        <property name="hibernate.search.default.elasticsearch.refresh_after_write" value="true"/>

    </properties>
</persistence-unit>

我的实体:

@Entity
@Table(name = "groups")
@Indexed(index = "group")
public class Group {
    private Long id;
    private Long projectId;
    private String name;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Field
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Basic
    @Column(name = "project_id")
    @Field
    public Long getProjectId() {
        return projectId;
    }

    public void setProjectId(Long projectId) {
        this.projectId = projectId;
    }


    @Basic
    @Column(name = "name")
    @Field
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }   
}

这就是我所有的配置,当我使用 JPA 保存方法创建实体时,我想休眠搜索自动创建索引,但不是。

谢谢。

【问题讨论】:

    标签: hibernate jpa elasticsearch hibernate-search


    【解决方案1】:

    为了让 Hibernate Search 插入 Hibernate ORM,并在实体持久化时对其进行索引,您还需要添加 org.hibernate:hibernate-search-orm 模块作为项目的依赖项:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-search-orm</artifactId>
        <version>5.6.0.Final</version>
    </dependency>
    

    也许缺少这种依赖关系?

    【讨论】:

    • 我的项目是老项目,使用的是hibernate core 4.3.8,如果我使用hibernate-search-orm 5.6.0.Final会有一些错误。所以,我不使用 hibernate-search-orm ,直接使用 hibernate-search-elasticsearch 。
    • @diligent 您必须使用 hibernate-search-orm 才能自动对 Hibernate 实体进行索引。
    • @diligent 另外,请注意 Hibernate Search 5.6 仅支持 Hibernate Core 5.0 和 5.1 版本。恐怕您必须升级您的 Hibernate Core 版本(无论如何这将是一件好事),否则您将无法使用 Hibernate Search。
    • 是的,我升级hibernate版本,导入hibernate-search-orm,效果很好。
    【解决方案2】:

    使用此属性启用 Elasticsearch 索引管理器时:

    <property name="hibernate.search.default.indexmanager" value="elasticsearch"/>
    

    这将获取在 Elasticsearch 上创建的索引,而不是本地 Lucene 索引。

    基本上这些其他选项被忽略了:

    <property name="hibernate.search.default.directory_provider" value="filesystem"/>
    <property name="hibernate.search.default.indexBase" value="/Users/yybbk/index"/>
    

    Hibernate Search 应该已经在 Elasticsearch 上自动创建了索引。 您应该能够使用指向http://localhost:9200/group/?pretty 的浏览器检查(其中“组”是索引名称,我从您的@Indexed 注释中复制了该名称)。

    【讨论】:

    • 谢谢桑恩。我移动了 directory_provider 和 indexBase 属性,离开了 indexmanager 属性,但仍然无法创建索引。
    • 你怎么知道没有索引?你有什么错误吗?
    • 我浏览 localhost:9200/group/?pretty 告诉我:index_not_found_exception,它的状态是 404。
    猜你喜欢
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2017-04-08
    相关资源
    最近更新 更多