【问题标题】:Hibernate Search: Index an XML String?休眠搜索:索引 XML 字符串?
【发布时间】:2017-10-05 15:40:47
【问题描述】:

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

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

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

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

【问题讨论】:

  • 嗯,当然可以。不过,您可能需要一些自定义代码。最后,更多的是如何在 Lucene 中索引和查询(任意?)XML。我已经有一段时间没有同时使用(HSEARCH 和 Lucene)了,但是一种索引方法可能是从 xpath 中创建一个 Lucene 字段名称(例如xmlField_myElement_myChildElement)并为该字段存储值Foo。跨度>

标签: java xml hibernate jpa hibernate-search


【解决方案1】:

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

但如果必须,是的,您可以索引 XML 格式的字段。

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

然后您可以使用@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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多