我使用hibernate、maven和mysql与spring一起工作,试图为电影和演员创建一个简单的网站。我想要的是一种搜索方法,在其中键入一个单词或一个单词/名称的一部分,您将得到一些结果,这是我的查询:
@Transactional
public List<Movie> searchForMovie(String searchText) {
FullTextSession fullTextSession = Search.getFullTextSession(getSession());
QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Movie.class).get();
org.apache.lucene.search.Query query = qb.keyword().onFields("year", "title").matching(searchText)
.createQuery();
org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery(query, Movie.class);
List<Movie> results = hibQuery.list();
return results;
}
如您所见,我使用的是“keyword”,这意味着您必须搜索整个单词/名称,而不仅仅是其中的一部分。例如,如果我想找到电影《饥饿游戏》,我就必须输入《饥饿》或《游戏》,我想要的是能够只写《饥饿》,仍然能得到结果。我好像找不到一个可以这么做的问题,思想?
最佳答案
您可以对此使用hibernate通配符查询。
? - represents a single character
* - represents any character sequence.
请注意,出于性能目的,建议查询不要以开头?或者是*。
QueryBuilder qb = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(Movie.class).get();
org.apache.lucene.search.Query query = qb
.keyword().wildcard().onFields("year", "title")
.matching(searchText + "*")
.createQuery();
请参阅hibernate文档以获得完整的参考。
5.1.2.3通配符查询。
http://docs.jboss.org/hibernate/search/4.4/reference/en-US/html/search-query.html#search-query-querydsl