JPA で Hibernate Search を 2 日間使用しようとしましたが、すべてがきれいにコンパイルされ、明白なエラーなしで実行されています。ただし、最初のインデックスを作成しようとすると、プログラムが実行され、インデックスを作成している各オブジェクトが (手動インデックスを使用して) 表示され、"Indexing Completed" メッセージが表示されます。いいえ、エラーはスローされませんが、メイン メソッドは終了しません。jre1.7 を使用して Maven プロジェクトの Eclipse Kepler で実行しているため、赤い停止ボタンを押すことで処理を強制終了できます。私がそうすると、インデックスファイルのファイル検索を行いますが、何も見つかりません。検索プログラムを実行すると、 java.lang.IllegalArgumentException: None of the specified entity types or any of their subclasss are indexed が発生します。
これを機能させる方法についての提案を本当に感謝します。休止状態検索のバージョン 4.2 に戻そうとしましたが、同じ結果が得られました。
ドメイン クラスは Car です。インデクサーの出力は次のとおりです。
Indexing: Make Infinity Model G35
Indexing: Make Honda Model Civic
Indexing: Make Audi Model A4
Indexing: Make Toyota Model Carolla
Indexing Completed
デバッガーで実行すると、プログラムが終了しているはずのときに、デバッグ ウィンドウに次のアクティブなスレッドが表示されます。
com.xyzco.search.Indexer at localhost:52231
Daemon Thread [MySQL Statement Cancellation Timer] (Running)
Thread [Hibernate Search: Index updates queue processor for index com.xyzco.search.Car-1] (Running)
Thread [Hibernate Search: IndexWriter worker executor for com.xyzco.search.Car-1] (Running)
Thread [DestroyJavaVM] (Running)
インデクサーのコードは次のとおりです。
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.hibernate.search.jpa.FullTextEntityManager;
public class Indexer {
public static void main(String[] args) {
try {
EntityManagerFactory entityManagerFactory = Persistence
.createEntityManagerFactory("dbschema");
EntityManager em = entityManagerFactory.createEntityManager();
FullTextEntityManager ftem = org.hibernate.search.jpa.Search
.getFullTextEntityManager(em);
ftem.getTransaction().begin();
@SuppressWarnings("unchecked")
List<Car> cars = em.createQuery(
"select c from Car c").getResultList();
for (Car car : cars) {
ftem.index(car); // manually index an item instance
System.out.println("Indexing: Make " + car.getMake() + " Model " + car.getModel());
}
ftem.getTransaction().commit(); // index are written at commit time
em.close();
System.out.println("Indexing Completed");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Car クラスのコードは次のとおりです。
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.Store;
@Entity
@Indexed //Mark for indexing
public class Car {
@Id @GeneratedValue
@DocumentId //Mark id property shared by Core and Search
private Integer id;
@Field //Mark for indexing using tokenization
private String make;
@Field
private String model;
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
private String description;
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
private String options;
// getters and setters left out...
}
ここにpersistence.xmlがあります
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="dbschema"> <!-- transaction-type="RESOURCE_LOCAL"> -->
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.xyzco.search.Car</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/referencedata"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="hibernate.search.default.directory_provider"
value="filesystem" />
<property name="hibernate.search.default.indexBase" value="/usr/lucene/indexes" />
</properties>
</persistence-unit>
</persistence>
これはPOMの一部です(Hibernateサイトで提案されているプロファイルを使用)
...
<profile>
<id>jboss-public-repository</id>
...
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${sl4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- HIBERNATE SEARCH -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.2.2.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search</artifactId>
<version>4.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>3.6.2</version>
</dependency>
</dependencies>