Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate搜索:索引XML字符串?_Java_Xml_Hibernate_Jpa_Hibernate Search - Fatal编程技术网

Java Hibernate搜索:索引XML字符串?

Java 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搜索查询

我使用Hibernate搜索映射了一个JPA实体。实体有一个字段,该字段将由XML
字符串构成。是否可以索引该
字符串的值并对其执行搜索

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

<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