Using Hibernate Search for Full-Text Search Capabilities

Welcome back to our Hibernate series! In this post, we will delve into Hibernate Search, a powerful extension of Hibernate that enables full-text search capabilities in your applications. Full-text search is essential for scenarios where you need to query data efficiently based on textual content.

What is Hibernate Search?

Hibernate Search integrates the Hibernate ORM with Apache Lucene and now also with Elasticsearch for full-text search functionality. This allows you to perform complex search queries using natural language, as well as execute multi-field and fuzzy searches.

Setting Up Hibernate Search

To get started, you need to add the Hibernate Search dependencies to your project. Here’s how you can do it in your Maven pom.xml file:

<dependency>
    <groupId>org.hibernate.search</groupId>
    <artifactId>hibernate-search-mapper-orm</artifactId>
    <version>6.1.0.Final</version>
</dependency>

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>8.0.0</version>
</dependency>

Annotating Your Entity for Indexing

Next, you will need to annotate your entity class to indicate what fields should be indexed. Here’s an example using a Product entity:

import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;

@Indexed
@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @GenericField
    private String name;

    @GenericField
    private String description;

    // Getters and setters
}

In this example:

  • @Indexed tells Hibernate Search to index this entity.
  • @GenericField marks the fields to be indexed for full-text search.

Creating a Full-Text Search Query

Once your entity is indexed, you can perform full-text searches. Here’s an example of how to create a simple search query:

import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
import org.hibernate.search.mapper.orm.search.predicate.SearchPredicate;
import org.hibernate.search.mapper.orm.Search;

public List<Product> searchProducts(String searchTerm) {
    try (Session session = sessionFactory.openSession()) {
        return session.createTransaction();
        return Search.session(session)
                .search(Product.class)
                .where(f -> f.match().fields("name", "description")
                    .matching(searchTerm))
                .fetchHits(20);
    }
}

In this code:

  • We open a session and start a search for products based on the searchTerm.
  • We specify that we want to match against the name and description fields.
  • The fetchHits(20) method retrieves the top 20 matching products.

Indexing and Synchronizing Data

For Hibernate Search to work effectively, it’s crucial to keep your index in sync with the database. Hibernate automatically manages indexing when you persist, update, or delete entities. However, in certain situations, you may want to manually trigger re-indexing:

public void indexAllProducts() {
    try (Session session = sessionFactory.openSession()) {
        Search.session(session)
            .massIndexer()
            .startAndWait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

In the above method, the massIndexer() allows you to index all products in bulk, ensuring they are all up to date. This is useful when migrating data or after significant changes in product data.

Conclusion

Hibernate Search is a powerful tool that enables full-text search features within your Hibernate-enabled applications. In this post, we explored how to set up Hibernate Search, annotate your entities for indexing, and perform search queries.

By integrating full-text search capabilities into your applications, you can enhance user experience and make data retrieval efficient and intuitive. Stay tuned for more insights as we explore the vast world of Hibernate!

To learn more about ITER Academy, visit our website: ITER Academy.

Scroll to Top