Java Hibernate搜索:索引XML字符串?
我使用Hibernate搜索映射了一个JPA实体。实体有一个字段,该字段将由XMLJava Hibernate搜索:索引XML字符串?,java,xml,hibernate,jpa,hibernate-search,Java,Xml,Hibernate,Jpa,Hibernate Search,我使用Hibernate搜索映射了一个JPA实体。实体有一个字段,该字段将由XML字符串构成。是否可以索引该字符串的值并对其执行搜索 例如,如果我的XMLString看起来像: <myElement> <myChildElement>Foo</myChildElement> </myElement> 福 是否可以查询具有myChildElement等于Foo的字段的实体?如果是,我将如何映射实体中的字段?如何形成Hibernate搜索查询
字符串构成。是否可以索引该字符串的值并对其执行搜索
例如,如果我的XMLString
看起来像:
<myElement>
<myChildElement>Foo</myChildElement>
</myElement>
福
是否可以查询具有myChildElement
等于Foo
的字段的实体?如果是,我将如何映射实体中的字段?如何形成Hibernate搜索查询?我不确定将XML存储在实体属性中是否是个好主意;从长远来看,解析XML并将其存储为字符串字段而不是字符串字段可能更容易
但是,如果必须这样做,可以为XML格式的字段编制索引
您将必须实现一个新的应用程序。在您的实现中,您将使用一些XML解析器,提取对您重要的XML节点的值,并将这些值添加到文档中的字段中。根据需要命名字段,xmlField\u myElement\u myChildElement
按照@Thomas的建议就可以了
然后可以将实体属性映射到@Field(bridge=@FieldBridge(impl=MyFieldBridgeImpl.class))
。不过,您可能需要特别调整,analyzer
要查询该字段,请执行以下操作,无需特别说明。您可能需要调用.ignoreFieldBridge
,以避免搜索字符串被解析为XML,但仅此而已:
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();
FullTextEntityManager FullTextEntityManager=
Search.getFullTextEntityManager(entityManager);
QueryBuilder qb=fullTextEntityManager.getSearchFactory()
.buildQueryBuilder()
.forEntity(MyEntity.class)
.get();
Query luceneQuery=qb.keyword()
.onField(“xmlField\u myElement\u myChildElement”)
.ignoreFieldBridge()
.匹配(搜索字符串)
.createQuery();
列表结果=(列表)fullTextEntityManager
.createFullTextQuery(luceneQuery,MyEntity.class)
.list();
好吧,你当然可以这么做。不过,您可能需要一些自定义代码。最后,更多的是如何在Lucene中索引和查询(任意?)XML。我已经有一段时间没有同时使用(HSEARCH和Lucene)了,但是一种索引的方法可能是从xpath(例如xmlField\u myElement\u myChildElement
)创建一个Lucene字段名,并存储该字段的值Foo
。