java - Hibernate Search 不索引数据库中的项目

标签 java spring hibernate lucene hibernate-search

我正在尝试将 Hibernate Search 集成到我的应用程序中。 粗略总结需要做什么:

  • Spring Batch 读出一个 XML 文件并将对象保存到数据库中。这是通过 de JDBCBatchItemWriter 完成的。不是 HibernateItemWriter,因为性能较慢。
  • 插入所有项目后,我想构建 Hibernate Search/Lucene 索引。

问题出在最后一步。没有任何内容被编入索引。

设置如下:

有一个 JobListener,我在其中索引数据库中的数据,如下所示:

Session session = sessionFactory
 .withOptions()
 .openSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
try {
  fullTextSession.createIndexer().startAndWait();
} catch (InterruptedException e) {
  e.printStackTrace();
}

但是当我用 Luke 检查我的索引时,我在其中找不到任何记录。 我想这与交易有关,但我不知道如何让它发挥作用。

这是我的持久性配置:

    @Bean
  public EntityManagerFactory entityManagerFactory() {
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    entityManagerFactoryBean.setPackagesToScan("xxx.data.domain");
    entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
    entityManagerFactoryBean.setDataSource(dataSource());
    entityManagerFactoryBean.getJpaPropertyMap().putAll(jpaProperties());
    entityManagerFactoryBean.afterPropertiesSet();

    return entityManagerFactoryBean.getObject();
  }


  @Bean
  public FullTextEntityManager fullTextEntityManager(EntityManager entityManagerFactory) throws InterruptedException {
    FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManagerFactory);
    fullTextEntityManager.createIndexer().startAndWait();
    return fullTextEntityManager;
  }

  private Map<String, String> jpaProperties() {
    Map<String, String> jpaProperties = new HashMap<String, String>();
    jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.OracleDialect");
    jpaProperties.put("hibernate.search.default.directory_provider", "filesystem");
    jpaProperties.put("hibernate.search.default.indexBase", "/tmp/lucene/indexes");
    jpaProperties.put("hibernate.search.indexing_strategy", "manual");
    return jpaProperties;
  }


  @Bean
  public SessionFactory sessionFactory(DataSource dataSource) throws IOException {
    LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
    localSessionFactoryBean.setDataSource(dataSource);
    localSessionFactoryBean.setPackagesToScan("xxx.data.domain");
    localSessionFactoryBean.afterPropertiesSet();

    return localSessionFactoryBean.getObject();
  }

要索引的实体:

@Entity
@Table(name = "MY_TABLE")
@Indexed
public class EntryEntity {
  public static final String SEQUENCE_NAME = "SEQ_MY_TABLE";

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE_NAME)
  @SequenceGenerator(name = SEQUENCE_NAME, sequenceName = SEQUENCE_NAME, allocationSize = 1)
  @Column(name = "ID")
  private Long id;

  @Column(name = "ENTRY_ID")
  @Field(index = Index.YES, analyze = Analyze.NO, store = Store.YES)
  private String entryIdentifier;

  @Column
  @Field(index = Index.YES, analyze = Analyze.NO, store = Store.YES)
  private String value;

  public String getValue() {
    return value;
  }

  public void setValue(String value) {
    this.value = value;
  }
}

最佳答案

我认为问题在于您在实体管理器处理的 jpaProperties 中定义了您的搜索属性。然而,当您调用质量索引器时,您使用的是普通 session 。在这种情况下,不会选取 JPA 属性。我的猜测是相对于您启动 JVM 的位置创建了一些索引目录。 实际上,您应该始终使用 EntityManager。还有一个 org.hibernate.search.jpa.Search,它允许您获取一个 FullTextEntityManager

关于java - Hibernate Search 不索引数据库中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30818117/

相关文章:

Java、Spring、Ant部署两个war文件

spring - 为什么 BeanDefinition.getPropertyValues 返回一个空列表

java - 比较 int 和 long 时发生 Hibernate ClassCastException

java - 组织.hibernate.AnnotationException : @OneToOne or @ManyToOne on <entity> references an unknown entity

java - 如果实际参数是 lambda,则在重载方法之间进行选择

java - 日期解析失败

java - 如何在主应用程序中调用带有数组参数的函数?

java - 检查通用对象的对象类型的正确方法是什么?

spring - 最佳 Spring MVC、Hibernate、Mysql 和 Maven 应用程序托管服务器

hibernate - gradle 说, 'see compiler error output' ,但没有