diff --git a/persistence-modules/spring-hibernate-5/pom.xml b/persistence-modules/spring-hibernate-5/pom.xml
index f1f3d10347..8dc447c3b7 100644
--- a/persistence-modules/spring-hibernate-5/pom.xml
+++ b/persistence-modules/spring-hibernate-5/pom.xml
@@ -57,6 +57,11 @@
jta
${jta.version}
+
+ org.hibernate
+ hibernate-search-orm
+ ${hibernatesearch.version}
+
org.apache.tomcat
@@ -184,6 +189,7 @@
5.2.10.Final
+ 5.8.2.Final
8.0.7-dmr
9.0.0.M26
1.1
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java
new file mode 100644
index 0000000000..6bbd2625fc
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java
@@ -0,0 +1,76 @@
+package com.baeldung.hibernatesearch;
+
+import com.google.common.base.Preconditions;
+import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.JpaVendorAdapter;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.persistence.EntityManagerFactory;
+import javax.sql.DataSource;
+import java.util.Properties;
+
+@EnableTransactionManagement
+@Configuration
+@PropertySource({ "classpath:persistence-h2.properties" })
+@EnableJpaRepositories(basePackages = { "com.baeldung.hibernatesearch" })
+@ComponentScan({ "com.baeldung.hibernatesearch" })
+public class HibernateSearchConfig {
+
+ @Autowired
+ private Environment env;
+
+ @Bean
+ public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
+ LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
+ em.setDataSource(dataSource());
+ em.setPackagesToScan(new String[] { "com.baeldung.hibernatesearch.model" });
+
+ JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
+ em.setJpaVendorAdapter(vendorAdapter);
+ em.setJpaProperties(additionalProperties());
+
+ return em;
+ }
+
+ @Bean
+ public DataSource dataSource() {
+ final BasicDataSource dataSource = new BasicDataSource();
+ dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
+ dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
+
+ return dataSource;
+ }
+
+ @Bean
+ public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
+ JpaTransactionManager transactionManager = new JpaTransactionManager();
+ transactionManager.setEntityManagerFactory(emf);
+
+ return transactionManager;
+ }
+
+ @Bean
+ public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
+ return new PersistenceExceptionTranslationPostProcessor();
+ }
+
+ Properties additionalProperties() {
+ Properties properties = new Properties();
+ properties.setProperty("hibernate.hbm2ddl.auto", Preconditions.checkNotNull(env.getProperty("hibernate.hbm2ddl.auto")));
+ properties.setProperty("hibernate.dialect", Preconditions.checkNotNull(env.getProperty("hibernate.dialect")));
+ return properties;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/ProductSearchDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/ProductSearchDao.java
new file mode 100644
index 0000000000..210c1c58b3
--- /dev/null
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/ProductSearchDao.java
@@ -0,0 +1,195 @@
+package com.baeldung.hibernatesearch;
+
+import com.baeldung.hibernatesearch.model.Product;
+import org.apache.lucene.search.Query;
+import org.hibernate.search.engine.ProjectionConstants;
+import org.hibernate.search.jpa.FullTextEntityManager;
+import org.hibernate.search.jpa.FullTextQuery;
+import org.hibernate.search.jpa.Search;
+import org.hibernate.search.query.dsl.QueryBuilder;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.List;
+
+@Repository
+public class ProductSearchDao {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ public List searchProductNameByKeywordQuery(String text) {
+
+ Query keywordQuery = getQueryBuilder()
+ .keyword()
+ .onField("productName")
+ .matching(text)
+ .createQuery();
+
+ List results = getJpaQuery(keywordQuery).getResultList();
+
+ return results;
+ }
+
+ public List searchProductNameByFuzzyQuery(String text) {
+
+ Query fuzzyQuery = getQueryBuilder()
+ .keyword()
+ .fuzzy()
+ .withEditDistanceUpTo(2)
+ .withPrefixLength(0)
+ .onField("productName")
+ .matching(text)
+ .createQuery();
+
+ List results = getJpaQuery(fuzzyQuery).getResultList();
+
+ return results;
+ }
+
+ public List searchProductNameByWildcardQuery(String text) {
+
+ Query wildcardQuery = getQueryBuilder()
+ .keyword()
+ .wildcard()
+ .onField("productName")
+ .matching(text)
+ .createQuery();
+
+ List results = getJpaQuery(wildcardQuery).getResultList();
+
+ return results;
+ }
+
+ public List searchProductDescriptionByPhraseQuery(String text) {
+
+ Query phraseQuery = getQueryBuilder()
+ .phrase()
+ .withSlop(1)
+ .onField("description")
+ .sentence(text)
+ .createQuery();
+
+ List results = getJpaQuery(phraseQuery).getResultList();
+
+ return results;
+ }
+
+ public List searchProductNameAndDescriptionBySimpleQueryStringQuery(String text) {
+
+ Query simpleQueryStringQuery = getQueryBuilder()
+ .simpleQueryString()
+ .onFields("productName", "description")
+ .matching(text)
+ .createQuery();
+
+ List results = getJpaQuery(simpleQueryStringQuery).getResultList();
+
+ return results;
+ }
+
+ public List searchProductNameByRangeQuery(int low, int high) {
+
+ Query rangeQuery = getQueryBuilder()
+ .range()
+ .onField("memory")
+ .from(low)
+ .to(high)
+ .createQuery();
+
+ List results = getJpaQuery(rangeQuery).getResultList();
+
+ return results;
+ }
+
+ public List