hibernate - 如何在 Hibernate Search 中搜索两个或更多术语?
问题描述
我想使用 Hibernate Search 进行正确查询,其中包含以下参数:
1)将短语分解为单词并在多个字段中搜索每个单词;
2) 搜索部分单词的能力;
3) 忽略大小写
在我的代码中,我使用术语迭代来实现它。但我想充分利用 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();
}
}
谁能帮助我,因为我是 Hibernate Search 的新手?
也许有人可以分享他们自己的代码?我将不胜感激
我已经解决了我的问题,但有两个版本的代码:
版本 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;
}
版本 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();
}
解决方案
推荐阅读
- javascript - jQuery验证错误信息定位很奇怪
- c - c - 用空终止符覆盖换行符转义字符会导致段错误
- r - 查看路口附近的地块
- sql-server - SQL Server 动态 groupby 数据透视
- r - 如何应用于矩阵列表中第 j 个矩阵的每个第 i 列
- php - 获取通话状态 twilio php
- python - 在 Amazon Cognito MFA 中恢复
- haskell - 用 zipWith 写 zip
- angular - 无法读取未定义的属性“NullLogger”
- java - Connection with Java Spring, maven, oracle, hibernate