Frage

Ich fange gerade mit Hibernate Search. Der Code, den ich um die Suche zu tun bin mit von der Referenz Führer genommen:

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;
}

Ich stelle fest, dass die Abfrage Begriffe als Begriffe in einer Disjunktion interpretiert werden (OR). Ich möchte sie vielmehr als Verbindung Begriffe interpretiert werden.

War es hilfreich?

Lösung

Wenn Sie die Abfrage-Parser verwenden, dann könnte man es auf diese Weise tun:

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

Andere Tipps

Da Sie die Hibernate Search query DSL verwenden Sie Ihre Abfrage schreiben könnte wie:

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

Beachten Sie, dass die Abfrage-Zeichenfolge nicht über die Lucene Query Parser analysiert wird. Es hat die Begriffe enthalten, wie Sie für sie suchen möchten (Analysatoren angewendet werden!)

Ich weiß nicht, zu Hibernate Search viel, aber ich denke, ‚Schlüsselwort ()‘ wird eine Suche vorzubereiten basierend auf Tags, die im Allgemeinen OR-basiert sind.

Es gibt ähnliche Fragen in den beiden obigen Links, hoffen, es hilft: Schlüsselwort (OR, AND) in Lucene suchen https://forum.hibernate.org/viewtopic.php?f= 9 & t = 1008903 & start = 0

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top