3

我刚刚开始使用 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;
}

我注意到查询术语被解释为析取(OR)中的术语。我希望它们被解释为连词。

4

3 回答 3

3

如果您使用查询解析器,那么您可以这样做:

    QueryParser queryParser = new QueryParser("all", new GermanSnowBallAnalyzer());
    queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
    Query luceneQuery = queryParser.parse(QueryParser.escape(keyword));
于 2011-01-06T13:41:45.033 回答
2

由于您使用的是 Hibernate Search 查询 DSL,因此您可以将查询编写为:

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

请注意,查询字符串不是通过 Lucene 查询解析器解析的。它必须包含您要搜索的术语(将应用分析器!)

于 2011-01-07T11:23:27.523 回答
1

我不太了解 Hibernate Search,但我猜 'keyword()' 会准备一个基于标签的搜索,这些标签通常是基于 OR 的。

上面两个链接中有类似的问题,希望对您有所帮助: Lucene中的关键字(OR,AND)搜索 https://forum.hibernate.org/viewtopic.php?f=9&t=1008903&start=0

于 2011-01-06T12:34:37.613 回答