我正在使用spring,使用hibernate,maven和mysql,我正在尝试为电影和演员制作一个简单的网站。我想要的是一种搜索方法,您可以在其中键入单词或单词/名称的一部分,然后您将获得一些结果,这是我的查询:
@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',这意味着您必须搜索整个单词/名称,而不仅仅是其中的一部分。例如,如果我想找到电影'饥饿游戏',我将不得不键入'饥饿'或'游戏',我想要的是只能写'hunge'并仍然得到结果。我似乎无法找到一个可以做到这一点的查询,想法?
答案 0 :(得分:3)
您可以使用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
答案 1 :(得分:2)
只需将.matching行更改为以下内容:
.matching("*"+searchText+"*")
使用通配符以您认为合适的任何组合获得结果。
希望对你有用。
答案 2 :(得分:0)
您可以对关键字使用Hibernate Search的FuzzySearch。您的代码将如下所示:
QueryBuilder qb = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(Movie.class).get();
org.apache.lucene.search.Query query = qb
.keyword().fuzzy().withEditDistanceUpTo(1).withPrefixLength(1).onFields("year","title")
.matching(searchText)
.createQuery();
请参阅休眠文档以获取完整参考。
5.1.2.2模糊查询。 http://docs.jboss.org/hibernate/search/4.4/reference/en-US/html/search-query.html#search-query-querydsl