Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate搜索-在给定范围内搜索_Java_Hibernate_Lucene_Hibernate Search - Fatal编程技术网

Java Hibernate搜索-在给定范围内搜索

Java Hibernate搜索-在给定范围内搜索,java,hibernate,lucene,hibernate-search,Java,Hibernate,Lucene,Hibernate Search,假设我有以下几节课。(仅包括最重要的内容) 我的基本文档搜索如下所示: public List<AbstractDocument> searchDocuments(String text) { if (text == null) { return newArrayList(); } FullTextEntityManager ftem = Search.getFullTextEntityManager(entityManagerProvide

假设我有以下几节课。(仅包括最重要的内容)

我的基本文档搜索如下所示:

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();
}
公共列表搜索文档(字符串文本){
if(text==null){
返回newArrayList();
}
FullTextEntityManager ftem=Search.getFullTextEntityManager(EntityManager提供程序.get());
MultiFieldQueryParser parser=新的MultiFieldQueryParser(DOCUMENT_字段,new StandardAnalyzer());
解析器.setDefaultOperator(运算符.AND);
fulltextqueryftq;
试一试{
Query q=parser.parse(text+“*”);
ftq=ftem.createFullTextQuery(q,Document.class);
ftq.setMaxResults(20);
List results=ftq.getResultList();
返回结果;
}捕获(解析异常){
e、 printStackTrace();
}
返回newArrayList();
}

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

好的,我真的找到了解决办法。我(以及任何正在寻找相同问题解决方案的人)需要的是为FullTextQuery设置条件

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

    /* .... */

    ftq.setCriteriaQuery(criteria);

看起来不错:)

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

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

我认为对某些值使用索引是不合适的(例如对某些布尔数据进行过滤似乎不正确)+给定的示例简化了,实际关联要复杂得多-因此我想用其他方式过滤结果。嗯。。。我做了一些研究,我认为你是对的,标准不是最好的方法。我将继续索引其他值。谢谢。这是不推荐的。例如,getResultSize()将返回不正确的值,分页将被拧紧。我推荐哈迪或康戈五世的解决方案
    Session session = (Session) ftem.getDelegate();
    Criteria criteria = session.createCriteria(Document.class).createCriteria("clientAssociation").add(
            Restrictions.eq("client", owner));

    /* .... */

    ftq.setCriteriaQuery(criteria);