Pregunta

Me estoy empezando con Hibernate Search. El código que estoy utilizando para hacer la búsqueda se toma de la guía de referencia:

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

Me he dado cuenta que los términos de la consulta se interpretan como términos en una disyunción (OR). Me gustaría que se pueden interpretar como términos de conjunción en su lugar.

¿Fue útil?

Solución

Si utiliza el analizador de consultas, entonces usted podría hacerlo de esta manera:

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

Otros consejos

Desde que está utilizando la hibernación de consulta de búsqueda DSL podría escribir la consulta como:

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

Tenga en cuenta que la cadena de consulta no se analiza mediante el analizador de consultas de Lucene. Tiene que contener los términos que desea buscar para ellos (se aplicarán analizadores!)

No sé Hibernate Buscar demasiado, pero supongo 'palabra ()' preparará una búsqueda basada en etiquetas, que son en general o de base.

Hay preguntas similares en los dos enlaces de arriba, creo que sirve: palabra clave (OR, AND) busca en Lucene https://forum.hibernate.org/viewtopic.php?f= 9 & t = 1008903 & start = 0

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top