2016-08-09 96 views
0

Ich habe Artikel über schöne Hibernate Suche nach Datenbanktabellen durch Wildcards geschrieben.Hibernate + Lucene - Wildcard Suche Ergebnis leer

So habe ich es meinen pom.xml hinzugefügt:

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

Satz-Verzeichnis-Anbieter:

properties.put("hibernate.search.default.directory_provider", "ram"); 

und definierten Indizes auf meiner Einheit für Suchmechanismus sichtbar zu sein:

@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; 

    // ... 
} 

Dann habe ich manuell aus SQL-Skript-Datenbank-Tabelle geladen - CUSTOM_ENTITY:

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

und Ausführen von Code in meinem Repository:

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(); 

jedoch jedes Ergebnis Sammelzeit ist leer. Weißt du, ob ich einen Schritt verpasst habe? Sollte ich Daten mit Hibernate API anstelle von SQL-Skripten laden?


EDIT

Befor Abfrage läuft I-Daten manuell bin Indizierung:

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(); 

Ergebnis ist immer noch die gleichen.

Vielen Dank für Ihre Hilfe.

+0

Haben Sie die [Indizierung] (http://hibernate.org/search/documentation/getting-started/#indexing) vor [Suche] (http://hibernate.org/search/documentation/getting-started/# Suchen)? Ihre Anmerkungen sehen gut aus und sie sollten automatisch neue eingefügte Elemente erkennen und indizieren. Für vorhandene Daten müssen Sie jedoch den Massenindexer starten, um den Index neu zu erstellen. –

+0

Denken Sie auch daran, dass Ihr Index nicht beibehalten wird, wenn Sie das Verzeichnis "ram" verwenden. Starten Sie die Hibernate SessionFactory (oder JPA EntityManager) zwischen Indizierung und Abfragen neu? – Sanne

Antwort

0

Problem ist gelöst. Das Problem wurde mit der "Suchzeichenkette" des Kamels in Zusammenhang gebracht.

Ich bemerkte, dass, selbst wenn ich Werte in der Datenbank gespeichert haben, wie:

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

Lucene nicht in der Lage ist, durch String Test * suchen:

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

Wenn ich änderte meine Anfrage zu diesem:

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

Alles funktioniert gut. Ich weiß noch nicht warum, aber es hat das Problem behoben.

Vielen Dank für Ihre Zeit und Hilfe.

0

Nach having indexed alle Entitäten vor der Suche benötigen Sie eine richtige Wildcard-Abfrage mit ? oder *. Der Charakter ? repräsentiert ein einzelnes Zeichen und * steht für eine beliebige Zeichenfolge:

Angenommen, Sie das unten stehende Tabelle haben:

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

Dann mit ? Sie 3 Ergebnisse erhalten und mit * Sie erhalten 4 Ergebnisse.

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();