Pergunta

Digamos que eu tenha aulas seguintes. (apenas coisas mais importantes incluídas)

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 */
} 

Minha pesquisa básica de documentos é assim:

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

Agora, quero poder procurar documentos, mas não no escopo de todo o índice, mas apenas encontre documentos que pertencem ao determinado cliente. A única coisa que me vem à mente é adicionar a associação ao índice e adicionar ID do cliente ao campo apropriado na pesquisa. Mas isso não parece certo. Deve haver outra opção e é isso que estou pedindo.

Foi útil?

Solução

Por que sua ideia inicial parece estar errada? De fato, indexar todos os dados necessários para sua pesquisa é a maneira recomendada de fazer isso. É para isso que existe @IndexedEmbedded. A indexação dos dados também fornecerá mais flexibilidade para alterações na consulta e/ou novas consultas.

Outras dicas

A outra maneira de fazer isso é usar filtros. Um filtro pode ser aplicado a uma pesquisa do Lucene. Hibernate suporta a adição de filtros como anotações e permitindo -os no tempo de execução

Ok, eu realmente encontrei uma solução. A coisa que eu (e qualquer pessoa que estava procurando a solução do mesmo problema) é necessária é a criação de critérios para o FullTextQuery.

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

    /* .... */

    ftq.setCriteriaQuery(criteria);

Parece funcionar bem :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top