2016-12-03 3 views
1

ich Lucene konfiguriert mein Hibernate Modell von Wert in der Spalte suchen test:Hibernate Search (Lucene) zurückkehren leeres Ergebnis bei '=' in String

@Entity 
@Table(name = "TEST") 
@Audited 
@Indexed 
public class Test { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID") 
    private Long id; 

    @Column(name = "TEST") 
    @Field(index = Index.YES,analyze = Analyze.YES,store = Store.NO) 
    private String test; 

    ... 
} 

In Datenbank Testmodell enthält Werte Spalte folgenden Test:

  1. AB = ABC
  2. AB = BCD

ich habe fo llowing Code für durch Spaltenwert suchen:

String queryValue = "AB"; 
QueryBuilder qb = org.hibernate.search.jpa.Search.getFullTextEntityManager(em).getSearchFactory().buildQueryBuilder().forEntity(Test.class).get(); 
Query query = qb.all().createQuery(); 

BooleanJunction<BooleanJunction> conjuction = qb.bool(); 
String searchValue = new StringBuilder().append("*").append(queryValue .toLowerCase()).append("*").toString(); 
conjuction.should(qb.keyword().wildcard().onFields(new String[] { "test"}).matching(searchValue).createQuery()); 
query = conjuction.createQuery(); 

FullTextQuery textQuery = org.hibernate.search.jpa.Search.getFullTextEntityManager(em).createFullTextQuery(query, Test.class); 
return textQuery.getResultList(); 

obigen Code funktioniert findet Wert AB und Lucene Rückkehr mir 2 Aufzeichnungen, aber wenn ich für AB= Suche kehrt mir leer Ergebnis.


UPDATE

Hier ist der Code für die Indizierung:

FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em); 
fullTextEntityManager.createIndexer().startAndWait(); 

Sie wissen Sie, warum ich leer Ergebnis bin immer, da Lucen sollte mich 2 Datensätze zurückgeben? Wie kann ich es reparieren?

+0

Wie indexieren Sie es? – root545

+0

Ich meine Indexierung von ID – bontade

+0

Was ist der Analysator Sie Indexierung verwenden? – root545

Antwort

1

den Analyzer wird standardmäßig verwendet StandardAnalyzer https://docs.jboss.org/hibernate/search/5.3/reference/en-US/html_single/#analyzer

Die standaranalyzer spaltet Tokens auf = und entfernen Sie die = auch aus den erhaltenen Tokens.

so in Ihrem Fall, wenn Sie AB=ABC indexieren, werden die folgenden Token erstellt.

AB, ABC

Deshalb, wenn Sie für *AB* suchen Sie Ergebnisse

Aber wenn man für *AB=* suchen Sie nichts finden, da es keine solche Token ist.

+0

Vielen Dank für die Erklärung. Weißt du, was der beste Weg ist, um es zu reparieren und zu reparieren? – bontade

+1

Wenn Sie nicht möchten, dass Ihr Token auf "=" aufgeteilt wird, können Sie etwas wie "keywordTokenizer" verwenden. Dies wird den ganzen Satz als auf Token nehmen. Es kommt darauf an, wie Sie nach Ihren gespeicherten Dingen suchen möchten. Ich würde vorschlagen, dass Sie über Analysatoren in Lucene lesen. – root545

+0

Analyzer sind extrem leistungsfähig, anstatt sie zu "reparieren", sollten Sie versuchen, von den Vorteilen der Auswahl der richtigen für Ihr Ziel zu profitieren. Wenn Sie einfach eine "exakte Übereinstimmung" (auch als TermQuery bezeichnet) möchten, verwenden Sie analyze = NO für die Feldannotation. – Sanne

Verwandte Themen