ワイルドカードでデータベーステーブルを検索するための素晴らしいHibernate検索に関する記事を書いています。Hibernate + Lucene - 空の結果を返すワイルドカード検索
だから、私のpom.xmlにそれを追加しました:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-orm</artifactId>
<version>5.5.4.Final</version>
</dependency>
セットディレクトリプロバイダ:
properties.put("hibernate.search.default.directory_provider", "ram");
と検索メカニズムのために見えるように私のエンティティのインデックスを定義した:
@Entity
@Table(name = "CUSTOM_ENTITY")
@Audited
@Indexed
public class CustomEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
@DocumentId
private Long id;
@Column(name = "NAME1", nullable = false)
@NotEmpty
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
private String name1;
@Column(name = "NAME2", nullable = false)
@NotEmpty
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
private String name2;
@Column(name = "NAME3", nullable = false)
@NotEmpty
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
private String name3;
// ...
}
を
SQLスクリプトデータベーステーブルから手動でロードしました - CUSTOM_ENTITY:
私のリポジトリ内ID |NAME1 |NAME2 |NAME3 |
-------------------------
1 |Test1 |Test1 |Test1 |
2 |Test2 |Test2 |Test2 |
3 |Test3 |Test2 |Test2 |
と実行コード:
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
QueryBuilder qBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(CustomEntity.class).get();
Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("Test").createQuery();
// Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("Test*").createQuery();
// Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("Test%").createQuery();
List test = fullTextEntityManager.createFullTextQuery(luceneQuery, CustomEntity.class).getResultList();
しかし毎回結果コレクションが空です。私は一歩も逃したかどうか知っていますか? SQLスクリプトの代わりにHibernate APIを使用してデータをロードする必要がありますか?
EDIT
クエリを実行しているBefor私は手動でデータのインデックスを作成しています:
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
try {
fullTextEntityManager.createIndexer().startAndWait();
} catch (InterruptedException e) {
e.printStackTrace();
}
QueryBuilder qBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(CustomEntity.class).get();
Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("Test").createQuery();
// Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("Test*").createQuery();
// Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("Test%").createQuery();
List test = fullTextEntityManager.createFullTextQuery(luceneQuery, CustomEntity.class).getResultList();
結果は同じです。
ありがとうございました。
[検索](http://hibernate.org/search/documentation/getting-started)の前に[索引付け](http://hibernate.org/search/documentation/getting-started/#indexing)を行っていましたか? /#検索)?注釈は見栄えが良く、挿入された新しいエンティティを自動的に検出して索引付けする必要があります。ただし、既存のデータの場合は、索引を再構築するために一括インデクサを起動する必要があります。 –
また、 "ram"ディレクトリを使用すると、インデックスが保持されないことに注意してください。インデックスとクエリの間でHibernate SessionFactory(またはJPA EntityManager)を再起動しますか? – Sanne