2011-01-06 3 views
3

Я только начинаю с поиска в спящем режиме. Код, я использую, чтобы сделать поиск берется из справочника:Hibernate поиск начинающий вопрос

FullTextEntityManager fullTextEntityManager = 
    Search.getFullTextEntityManager(em); 
EntityTransaction transaction = em.getTransaction(); 

try 
{ 
    transaction.begin(); 

    // create native Lucene query using the query DSL 
    // alternatively you can write the Lucene query using the 
    // Lucene query parser or the Lucene programmatic API. 
    // The Hibernate Search DSL is recommended though 
    SearchFactory sf = fullTextEntityManager.getSearchFactory(); 
    QueryBuilder qb = sf 
     .buildQueryBuilder().forEntity(Item.class).get(); 

    org.apache.lucene.search.Query query = qb 
     .keyword() 
     .onFields("title", "description") 
     .matching(queryString) 
     .createQuery(); 

    // wrap Lucene query in a javax.persistence.Query 
    javax.persistence.Query persistenceQuery = 
    fullTextEntityManager.createFullTextQuery(query, Item.class); 

    // execute search 
    @SuppressWarnings("unchecked") 
    List<Item> result = persistenceQuery.getResultList(); 

    transaction.commit(); 

    return result; 
} 
catch (RuntimeException e) 
{ 
    transaction.rollback(); 
    throw e; 
} 

Я заметил, что термины запроса интерпретируются как термины в дизъюнкции (ИЛИ). Я бы хотел, чтобы они были интерпретированы как условия соединения.

ответ

3

Если используется анализатор запросов, то вы могли бы сделать это таким образом:

QueryParser queryParser = new QueryParser("all", new GermanSnowBallAnalyzer()); 
    queryParser.setDefaultOperator(QueryParser.AND_OPERATOR); 
    Query luceneQuery = queryParser.parse(QueryParser.escape(keyword)); 
1

Я не знаю Hibernate Поиск слишком много, но я думаю, что «keyword()» будет готовить поиск на основе тегов, которые обычно основаны на OR.

Есть подобные вопросы в двух ссылок выше, надеюсь, что это помогает: Keyword (OR, AND) search in Lucene https://forum.hibernate.org/viewtopic.php?f=9&t=1008903&start=0

2

С вами воспользуйтесь поиском в системе Hibernate для поиска по DSL, вы можете написать запрос следующим образом:

Query luceneQuery = qb 
    .bool() 
     .must(qb.keyword().onField("title").matching(queryString).createQuery()) 
     .must(qb.keyword().onField("description").matching(queryString).createQuery()) 
    .createQuery(); 

Обратите внимание, что строка запроса не анализируется с помощью парсера запросов Lucene. Он должен содержать условия, по которым вы хотите их искать (применяются анализаторы!)

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