Hibernate поиск новичка вопрос - PullRequest
3 голосов
/ 06 января 2011

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

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 ]

3 голосов
/ 06 января 2011

Если вы используете парсер запросов, то вы можете сделать это следующим образом:

    QueryParser queryParser = new QueryParser("all", new GermanSnowBallAnalyzer());
    queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
    Query luceneQuery = queryParser.parse(QueryParser.escape(keyword));
2 голосов
/ 07 января 2011

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

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

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

1 голос
/ 06 января 2011

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

В этих двух ссылках есть похожие вопросывыше, надеюсь, это поможет: Поиск по ключевым словам (ИЛИ, И) в Lucene https://forum.hibernate.org/viewtopic.php?f=9&t=1008903&start=0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...