Проверьте, существует ли индексированное поле

#hibernate-search #hibernate-search-6

#переход в режим гибернации -поиск #переход в режим гибернации-поиск-6

Вопрос:

Я пытаюсь перенести свое приложение с поиска в режиме гибернации с 5 на 6. В версии 6 я заметил, что добавлена проверка поля, и вы не можете выполнять поиск по полям, которых нет в индексе. К сожалению, у меня есть бизнес-логика, которая полагалась на это. Есть ли способ получить доступ к классу ElasticsearchIndexModel (насколько я вижу, в этом классе находится состояние полей) и проверить, существует ли определенное поле? Или есть какой-нибудь способ сделать это вообще?

Ответ №1:

Существует API метамодели.

Что-то вроде этого должно работать:

 <T> boolean isSearchable(SearchMapping mapping, Class<T> entityClass,
        String fieldPath) {
    SearchIndexedEntity<T> entity = mapping.indexedEntity( entityClass ); 
    IndexDescriptor index = bookEntity.indexManager().descriptor();
    Optional<IndexFieldDescriptor> fieldOptional = index.field(fieldPath)
    if (!fieldOptional.isPresent()) {
        return false;
    }
    IndexFieldDescriptor field = fieldOptional.get();
    return field.isValueField() amp;amp; field.toValueField().type().searchable();
}
 

Вы можете получить доступ к SearchMapping этому пути:

 SearchMapping mapping = Search.mapping( entityManagerFactory ); 
 

Или:

 SearchMapping mapping = Search.mapping( entityManager.getEntityManagerFactory() ); 
 

Или в Quarkus вы можете просто ввести его в свои компоненты:

 public class MyBean {
    @Inject
    SearchMapping mapping;


    ...
}