2016-08-09 6 views
0

ワイルドカードでデータベーステーブルを検索するための素晴らしい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(); 

結果は同じです。

ありがとうございました。

+0

[検索](http://hibernate.org/search/documentation/getting-started)の前に[索引付け](http://hibernate.org/search/documentation/getting-started/#indexing)を行っていましたか? /#検索)?注釈は見栄えが良く、挿入された新しいエンティティを自動的に検出して索引付けする必要があります。ただし、既存のデータの場合は、索引を再構築するために一括インデクサを起動する必要があります。 –

+0

また、 "ram"ディレクトリを使用すると、インデックスが保持されないことに注意してください。インデックスとクエリの間でHibernate SessionFactory(またはJPA EntityManager)を再起動しますか? – Sanne

答えて

0

問題を解決しました。問題は、ラクダのケース「検索文字列」に関連していました。

私は、データベースに格納された値を持っている場合でも、同じように気づい:私はこれに私のクエリを変更した場合

Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("Test*").createQuery(); 

:Luceneのは、文字列のテスト*で検索することができません

ID |NAME1 |NAME2 |NAME3 | 
------------------------- 
1 |Test1 |Test1 |Test1 | 
2 |Test2 |Test2 |Test2 | 
3 |Test3 |Test2 |Test2 | 

Query luceneQuery = qBuilder.keyword().wildcard().onFields("name1", "name2", "name3").matching("test*").createQuery(); 

すべて正常です。なぜ私はまだ分かりませんが、問題を修正しました。

ありがとうございました。

0

having indexedの前にすべてのエンティティを検索する前に、?または*という正しいワイルドカードクエリが必要です。

ID | NAME1 | NAME2 | NAME3 | 
------------------------------- 
1 | test1 | test1 | test1 | 
2 | test2 | test2 | test2 | 
3 | test3 | test3 | test3 | 
4 | test4A | test4B | test4C | 

その後?であなたは3件の結果を得るだろうと*であなたが得るだろう:

あなたは下の表をしたと仮定します。文字?は、任意の文字列を表す単一の文字と*を表し、 4結果

Query luceneQuery = qBuilder.keyword() 
    .wildcard() 
    .onFields("name1", "name2", "name3") 
    .matching("test?") // return {1, 2, 3} 
// .matching("test*") // return {1, 2, 3, 4} 
// .matching("test") // return {} 
    .createQuery(); 
関連する問題