I want to make a correct query using Hibernate Search, which contains the following parameters:
1) breaking the phrase into words and searching every word in several fields;
2) ability to search part of the word;
3) ignoring uppercase and lowercase
In my code I've implemented it using terms iteration. But I want to make the most of the Hibernate Search.
@Repository
public class ProductSearch {
@PersistenceContext
EntityManager em;
public List<Product> searchProducts(String text) throws InterruptedException, ParseException {
List<Product> allResults = new ArrayList<>();
for (String word : text.toLowerCase().split(" ")) {
Query wildcardQuery = getQueryBuilder()
.keyword()
.wildcard()
.onFields("productNumber", "category.uaName")
.matching("*" + word + "**")
.createQuery();
List<Product> results = getJpaQuery(wildcardQuery).getResultList();
for (Product result : results) {
if(!allResults.contains(result)) {
allResults.add(result);
}
}
}
return allResults;
}
private FullTextQuery getJpaQuery(org.apache.lucene.search.Query luceneQuery) {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
return fullTextEntityManager.createFullTextQuery(luceneQuery, Product.class);
}
private QueryBuilder getQueryBuilder() throws InterruptedException {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
fullTextEntityManager.createIndexer().startAndWait();
return fullTextEntityManager.getSearchFactory()
.buildQueryBuilder()
.forEntity(Product.class)
.get();
}
}
Can anyone help me, because I am new to Hibernate Search?
Maybe someone can share their own code? I will be very grateful
I've solved my problem but have two versions of code:
Version 1:
public List<Product> searchProducts(String text) throws InterruptedException, ParseException {
String[] fields = {"productNumber", "category.uaName"};
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
fullTextEntityManager.createIndexer().startAndWait();
org.apache.lucene.queryparser.classic.MultiFieldQueryParser parser = new MultiFieldQueryParser(
fields,
fullTextEntityManager.getSearchFactory().getAnalyzer("customanalyzer_query")
);
org.apache.lucene.search.Query luceneQuery =
parser.parse( text);
org.hibernate.search.jpa.FullTextQuery fullTextQuery =
fullTextEntityManager.createFullTextQuery( luceneQuery, Product.class );
List result = fullTextQuery.getResultList();
return result;
}
Version 2:
public List<Product> searchProducts(String text) throws InterruptedException, ParseException {
Query query = getQueryBuilder()
.keyword()
.onFields("productNumber", "category.uaName")
.matching(text)
.createQuery();
List<Product> results = getJpaQuery(query).getResultList();
return results;
}
private FullTextQuery getJpaQuery(org.apache.lucene.search.Query luceneQuery) {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
return fullTextEntityManager.createFullTextQuery(luceneQuery, Product.class);
}
private QueryBuilder getQueryBuilder() throws InterruptedException {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
fullTextEntityManager.createIndexer().startAndWait();
return fullTextEntityManager.getSearchFactory()
.buildQueryBuilder()
.forEntity(Product.class)
.overridesForField("productNumber", "customanalyzer_query")
.overridesForField("category.uaName", "customanalyzer_query")
.get();
}