我使用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

07-25 22:45
查看更多