2014-11-26 2 views
1

Я работаю с весной, используя hibernate, maven и mysql, я пытаюсь создать простой сайт для фильмов и актеров. Что я хотел бы способ поиска, где вы вводите слово или часть слова/название, и вы получите некоторые результаты, это мой запрос:spring mvc Hibernate Поисковый запрос

@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» и получать результаты. Кажется, я не могу найти запрос, который сделает это, мысли?

ответ

3

Для этого вы можете использовать подстановочные запросы для спящего режима.

? - 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 docs для получения полной справки.
5.1.2.3 Подстановочные запросы.
http://docs.jboss.org/hibernate/search/4.4/reference/en-US/html/search-query.html#search-query-querydsl

+0

спасибо, ребята, это работает отлично! (Раньше я старался с подстановочным знаком, но не использовал «*» ..) Спасибо! – user3486059

2

Просто измените .matching линию на следующее:

.matching("*"+searchText+"*") 

Используйте подстановочные знаки, чтобы получить результаты в любой комбинации вы считаете нужным.

Надеюсь, что сработает для вас.

Смежные вопросы