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