Hibernate Search - 在给定范围内搜索

时间:2010-02-19 10:56:47

标签: java hibernate lucene hibernate-search

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

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

    /* .... */

    ftq.setCriteriaQuery(criteria);

似乎工作正常:)