我想将facet requests放置到(某些)索引字段。为了发出构面请求,我需要知道相应字段的名称。
有没有办法以编程方式获取使用@Field
注释的字段名称列表?
答案 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的向后兼容性和发展。