Search code examples
hibernate-searchhibernate-search-6

Check if indexed field exists


I'm trying to migrate my application from hibernate search 5 to 6. What I noticed in version 6 is that a field validation is added and you can't search on fields that doesn't exists in the index. Unfortunately I have business logic that relied on that. Is there a way to access ElasticsearchIndexModel class(as far as I can see in this class is the fields state) and check if a specific field exists? Or is there any way to do that at all?


Solution

  • There is a metamodel API.

    Something like this should work:

    <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() && field.toValueField().type().searchable();
    }
    

    You can access the SearchMapping this way:

    SearchMapping mapping = Search.mapping( entityManagerFactory ); 
    

    Or:

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

    Or in Quarkus, you can simply have it injected into your beans:

    public class MyBean {
        @Inject
        SearchMapping mapping;
    
    
        ...
    }