Hibernate Search:获取分面

时间:2015-11-18 10:07:55

标签: hibernate-search

我想将facet requests放置到(某些)索引字段。为了发出构面请求,我需要知道相应字段的名称。

有没有办法以编程方式获取使用@Field注释的字段名称列表?

1 个答案:

答案 0 :(得分:0)

您的问题的答案取决于您使用的搜索版本。如果您正在使用预搜索5版本,可以在任何@Field(具有记录的限制)上进行分析,那么您可以使用公共元数据API来获取所有已配置的字段。

公共元数据API的入口点是SearchFactory.getIndexedTypeDescriptor(Class<?> entityType),它返回指定实体类型的IndexedTypeDescriptor。然后,您可以迭代已配置的属性,并为每个属性获取已配置字段的列表。

从搜索5开始,需要使用@Facet(s)在配置时标记构面字段。只有具有此注释的属性才能被刻面。显然,公共元数据API也应该公开它。不幸的是,这还没有实现 - HSEARCH-1853

如果您乐意使用某些可能在将来发生变化的内部API,则有一种解决方法。您只需要实施HSEARCH-1853,您可以切换到此公共(和支持)API。

搜索还维护一些称为内部元数据API的东西,它用于所有内部工作。它基本上只是一个更丰富的公共API模型,它对暴露的内容更具限制性。底线,您想要掌握org.hibernate.search.engine.metadata.impl.FacetMetadata。为此,您需要掌握DocumentBuilderIndexedEntity,这样您就可以访问内部org.hibernate.search.engine.metadata.impl.TypeMetadata。通过此类型元数据,您可以访问PropertyMetadata,然后DocumentFieldMetadata,最后FacetMetadata

要掌握DocumentBuilderIndexedEntity,您可以执行以下操作:

ExtendedSearchIntegrator integrator = ContextHelper.getSearchintegratorBySFI( sessionFactory );
IndexManager[] indexManagers = integrator.getIndexBinding( clazz ).getIndexManagers();
DirectoryBasedIndexManager indexManager = (DirectoryBasedIndexManager) indexManagers[0];
EntityIndexBinding indexBinding = indexManager.getIndexBinding(clazz);
DocumentBuilderIndexedEntity documentBuilder = indexBinding.getDocumentBuilder();

注意,内部API可能会在任何阶段发生变化。不保证API的向后兼容性和发展。