1

假设我有以下课程。(只包括最重要的东西)

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

我的基本文档搜索是这样的:

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

现在,我希望能够搜索文档,但不是在整个索引的范围内,而只是找到属于给定 Client 的文档。我唯一想到的是将关联添加到索引并将客户端 ID 添加到搜索中的相应字段。但这似乎不对。必须有另一种选择,这就是我所要求的。

4

3 回答 3

2

为什么你最初的想法似乎是错误的?事实上,索引搜索所需的所有数据是推荐的方法。这就是@IndexedEmbedded 的用途。索引数据还将为您在查询和/或新查询中的更改提供更大的灵活性。

于 2010-02-20T01:22:39.593 回答
1

您可以执行此操作的另一种方法是使用过滤器。过滤器可以应用于 Lucene 搜索。Hibernate 支持将过滤器添加为注解并在运行时启用它们

于 2010-03-03T01:07:29.000 回答
0

好的,我实际上找到了解决方案。我(以及任何正在寻找相同问题的解决方案的人)需要的是为 FullTextQuery 设置标准。

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

    /* .... */

    ftq.setCriteriaQuery(criteria);

似乎工作正常:)

于 2010-02-19T12:13:02.137 回答