2015-11-18 4 views

ответ

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.

Смежные вопросы