Pregunta

Vamos a decir que he siguientes clases. (Sólo las cosas más importantes incluidos)

public class Client {
    /* Some Properties */
}

public class ClientDocumentAssociation {
    @ManyToOne
    private Client client;

    /* Some Properties */
}

@Indexed
public class Document {
    @OneToOne
    private ClientDocumentAssociation clientAssociation;

    @Field(name = "text")
    private String text;

    /* Some Properties */
} 

Mi búsqueda básica documento es la siguiente:

public List<AbstractDocument> searchDocuments(String text) {
    if (text == null) {
        return newArrayList();
    }

    FullTextEntityManager ftem = Search.getFullTextEntityManager(entityManagerProvider.get());
    MultiFieldQueryParser parser = new MultiFieldQueryParser(DOCUMENT_FIELDS, new StandardAnalyzer());
    parser.setDefaultOperator(Operator.AND);
    FullTextQuery ftq;

    try {
        Query q = parser.parse(text + "*");

        ftq = ftem.createFullTextQuery(q, Document.class);

        ftq.setMaxResults(20);

        List<AbstractDocument> results = ftq.getResultList();
        return results;
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return newArrayList();
}

Ahora, quiero ser capaz de buscar documentos, pero no en el ámbito de todo el índice, pero acaba de encontrar documentos que pertenecen al cliente dado. La única cosa que viene a la mente es la adición de la asociación a la Identificación del índice y el complemento de cliente para el campo apropiado en la búsqueda. Pero eso no parece correcto. Tiene que haber otra opción y eso es lo que estoy pidiendo.

¿Fue útil?

Solución

¿Por qué su idea inicial parece estar mal? De hecho indexar todos los datos necesarios para su búsqueda es la forma recomendada de hacer esto. Eso es lo que está ahí para @IndexedEmbedded. Indexación de los datos también le dará más flexibilidad para los cambios en la consulta y / o nuevas consultas.

Otros consejos

La otra manera de hacer esto es utilizar filtros. Un filtro se puede aplicar a una búsqueda Lucene. Hibernate soporta la adición de filtros en forma de anotaciones y permitiéndoles en tiempo de ejecución

Está bien que en realidad se encontró una solución. Lo que me (y cualquier persona que iba en busca de solución del mismo problema) que se necesita es la creación de criterios para la FullTextQuery.

    Session session = (Session) ftem.getDelegate();
    Criteria criteria = session.createCriteria(Document.class).createCriteria("clientAssociation").add(
            Restrictions.eq("client", owner));

    /* .... */

    ftq.setCriteriaQuery(criteria);

Parece bien el trabajo :)

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