gpt4 book ai didi

java - hibernate 搜索 : Index an XML String?

转载 作者:行者123 更新时间:2023-12-02 12:10:25 29 4
gpt4 key购买 nike

我有一个使用 Hibernate Search 映射的 JPA 实体。该实体有一个由 XML String 组成的字段。是否可以索引该String的值并对其执行搜索?

例如,如果我的 XML String 看起来像:

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

是否可以查询 myChildElement 等于 Foo 的字段的实体?如果是这样,我将如何映射实体内的字段?如何形成 Hibernate Search 查询?

最佳答案

我不确定将 XML 存储在实体属性中是否是一个好主意;解析 XML 并将其存储为 embeddable object从长远来看,代替字符串字段可能会更容易。

但如果必须的话,可以,您可以为该 XML 格式的字段建立索引。

您必须实现 custom field bridge 。在您的实现中,您将使用一些 XML 解析器,提取对您重要的 XML 节点的值,并将这些值添加到文档中的字段中。根据需要命名字段,xmlField_myElement_myChildElement按照@Thomas 的建议就可以了。

然后您可以将您的实体属性映射为 @Field(bridge = @FieldBridge(impl = MyFieldBridgeImpl.class)) 。您可能需要调整other options不过,analyzer特别是。

要查询该字段,没有什么特别的,执行 the usual 。您可能需要调用.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();

关于java - hibernate 搜索 : Index an XML String?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46589708/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com