Domanda

Diciamo che ho seguito corsi. (Solo le cose più importanti inclusi)

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

La mia ricerca di base del documento è simile a questo:

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

Ora, voglio essere in grado di cercare i documenti, ma non nel campo di applicazione l'intero indice, ma basta trovare i documenti che appartengono alla data del client. L'unica cosa che mi viene in mente è l'aggiunta l'associazione per l'indice e aggiungere client id al campo appropriato alla ricerca. Ma questo non mi sembra giusto. Ci deve essere un'altra opzione ed è quello che sto chiedendo.

È stato utile?

Soluzione

Perché il vostro idea iniziale sembra essere sbagliato? Infatti indicizzare tutti i dati necessari per la ricerca è il modo consigliato di fare questo. Questo è ciò che è lì per @IndexedEmbedded. L'indicizzazione dei dati vi darà anche una maggiore flessibilità per le modifiche nella query e / o nuove query.

Altri suggerimenti

L'altro modo si può fare questo è quello di utilizzare i filtri. Un filtro può essere applicato a una ricerca Lucene. Hibernate supporta l'aggiunta di filtri come annotazioni e consentendo loro in fase di esecuzione

Ok realtà ho trovato una soluzione. La cosa che ho (e chiunque fosse alla ricerca di una soluzione dello stesso problema) necessaria è l'impostazione di criteri per la FullTextQuery.

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

    /* .... */

    ftq.setCriteriaQuery(criteria);

Sembra funzionare bene :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top