我的应用程序使用 Hibernate Search 4.5.0.Final ,当我尝试使用一个关键字进行搜索时工作正常。但是如果我尝试使用两个关键字,那么第二个关键字不会被Hibernate Search使用,只有第一个被HS考虑。
例如,如果我尝试搜索" James",搜索工作正常,应用程序返回所有" James"我在索引中有。但是,如果我试着搜索詹姆斯赫特菲尔德",结果又是所有"詹姆斯"而不是名字的独特结果" James Hetfield"。我需要对待詹姆斯赫特菲尔德"如" James AND Hetfield" 。
编辑:我犯了一个错误。搜索使用两个关键字,但使用" OR"而不是" AND" 。
我的代码:
public List<Person> search(String keywords) throws DAOException {
try {
FullTextEntityManager fullTextEm = Search.getFullTextEntityManager(this.entityManager);
QueryBuilder qb = fullTextEm.getSearchFactory().buildQueryBuilder().forEntity(Person.class).get();
Query query = qb.keyword().onFields("name", "email", "username", "phone").matching(keywords).createQuery();
FullTextQuery fullTextQuery = fullTextEm.createFullTextQuery(query);
fullTextQuery.setProjection("name", "email", "username", "phone");
Sort sortField = new Sort(new SortField("name_order", SortField.STRING));
fullTextQuery.setSort(sortField);
return fullTextQuery.getResultList();
}
catch (Exception e) {
logger.error("Error searching index: " + keywords, e);
throw new DAOException(e);
}
}
答案 0 :(得分:5)
找到解决方案。我拆分了String并使用了BooleanQuery。感谢@thomas。这是我的代码:
分裂:
String[] arrKeywords = keywords.split(" ");
this.search(Arrays.asList(arrKeywords));
然后,搜索:
public List<Person> search(String keywordsList) throws DAOException {
try {
FullTextEntityManager fullTextEm = Search.getFullTextEntityManager(this.entityManager);
QueryBuilder qb = fullTextEm.getSearchFactory().buildQueryBuilder().forEntity(Person.class).get();
List<Query> queryList = new LinkedList<Query>();
Query query = null;
for (String keyword : keywordsList) {
query = qb.keyword().onFields("name", "email", "username", "phone").matching(keyword).createQuery();
queryList.add(query);
}
BooleanQuery finalQuery = new BooleanQuery();
for (Query q : queryList) {
finalQuery.add(q, Occur.MUST);
}
FullTextQuery fullTextQuery = fullTextEm.createFullTextQuery(query);
fullTextQuery.setProjection("name", "email", "username", "phone");
Sort sortField = new Sort(new SortField("name_order", SortField.STRING));
fullTextQuery.setSort(sortField);
return fullTextQuery.getResultList();
}
catch (Exception e) {
logger.error("Error searching index: " + keywords, e);
throw new DAOException(e);
}
}
答案 1 :(得分:0)
在查询构建期间使用关键字MUST。 Hibernate Search还支持使用各种策略组合查询:
-SHOULD:查询应该包含子查询的匹配元素
-MUST:查询必须包含子查询的匹配元素
-MUST NOT:查询不得包含子查询的匹配元素
聚合类似于布尔值AND,OR和NOT。
Query combinedQuery = queryBuilder
.bool()
.must(queryBuilder.phrase()
.onField("productName).sentence("samsung galaxy s8")
.createQuery())
.must(queryBuilder.keyword()
.onField("productCategory").matching("smartphone")
.createQuery())
.createQuery();
// wrap Lucene query in an Hibernate Query object
org.hibernate.search.jpa.FullTextQuery jpaQuery =
fullTextEntityManager.createFullTextQuery(combinedQuery, Product.class);
// execute search and return results (sorted by relevance as default)
@SuppressWarnings("unchecked")
List<Product> results = jpaQuery.getResultList();