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.
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. –
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