2017-10-05 2 views
0

Ich habe eine JPA-Entity mit Hibernate Search zugeordnet. Die Entität hat ein Feld, das aus einem XML String besteht. Ist es möglich, den Wert dieses String zu indizieren und eine Suche dagegen durchzuführen?Hibernate Search: Index eine XML-Zeichenfolge?

Zum Beispiel, wenn mein XML String aussieht:

<myElement> 
    <myChildElement>Foo</myChildElement> 
</myElement> 

Wäre es möglich, für die Wesen mit einem Feld abzufragen, die myChildElement gleich Foo haben? Wenn ja, wie würde ich das Feld innerhalb der Entität abbilden? Wie formuliere ich die Hibernate Search-Abfrage?

+0

Nun, natürlich können Sie das tun. Sie benötigen jedoch möglicherweise benutzerdefinierten Code. Am Ende geht es eher darum, XML in Lucene zu indexieren und abzufragen. Ich habe nicht beide (HSEARCH und Lucene) in einer Weile verwendet, aber eine Möglichkeit zum Indexieren könnte darin bestehen, einen Lucene-Feldnamen aus dem X-Pfad zu erzeugen (z.B. 'xmlField_myElement_myChildElement') und den Wert' Foo' für dieses Feld zu speichern. – Thomas

Antwort

1

Ich bin mir nicht sicher, ob es so eine gute Idee ist, XML in Entitätseigenschaften zu speichern; Das Parsen des XML und Speichern als embeddable object anstelle eines String-Feldes könnte sich auf lange Sicht als einfacher erweisen.

Aber wenn Sie müssen, ja, können Sie dieses XML-formatierte Feld indizieren.

Sie müssen eine custom field bridge implementieren. In Ihrer Implementierung verwenden Sie einen XML-Parser, extrahieren die Werte für die XML-Knoten, die Ihnen wichtig sind, und fügen diese Werte dem Feld im Dokument hinzu. Benennen Sie die Felder, wie Sie wollen, xmlField_myElement_myChildElement wie von @Thomas vorgeschlagen wird gut tun.

Dann können Sie Ihre Entity-Eigenschaft mit @Field(bridge = @FieldBridge(impl = MyFieldBridgeImpl.class)) zuordnen. Vielleicht möchten Sie aber auch other options tun, insbesondere analyzer.

Um das Feld abzufragen, nichts besonderes, tun the usual. Möglicherweise müssen .ignoreFieldBridge rufen Sie Ihren Suchbegriff als XML analysiert werden, um zu vermeiden, aber das ist es:

FullTextEntityManager fullTextEntityManager = 
     Search.getFullTextEntityManager(entityManager); 

QueryBuilder qb = fullTextEntityManager.getSearchFactory() 
     .buildQueryBuilder() 
     .forEntity(MyEntity.class) 
     .get(); 

Query luceneQuery = qb.keyword() 
     .onField("xmlField_myElement_myChildElement") 
     .ignoreFieldBridge() 
     .matching(searchString) 
     .createQuery(); 

List<MyEntity> results = (List<MyEntity>) fullTextEntityManager 
     .createFullTextQuery(luceneQuery, MyEntity.class) 
     .list(); 
Verwandte Themen