【问题标题】:how to use Alfresco OperationContext to filter out documents?如何使用 Alfresco OperationContext 过滤掉文档?
【发布时间】:2015-06-09 07:15:35
【问题描述】:

我在 Alfresco 的一个文件夹中有很多文件。其中一些是pdf。 我想过滤我所有的 pdf 文档并只检索 pdf 文档。 现在我通过遍历一个非常大的列表来做到这一点,该列表是我通过 opencmis 从 alfresco 获得的,并查看文档名称并过滤它们(如果它们是 .pdf)。 我研究了 api 并看到了为此目的使用 OperationContext 的可能性,但我不知道该怎么做。 任何例子都会受到欢迎。

在我让所有文档过滤它们之前,有没有更好的方法来做到这一点?

这就是我现在要做的:

public List< Document > retrieveAllPdfInFolder( Folder target )
{
    List< Document > documentList = GenericsUtil.makeList();
    for (CmisObject cmisObject: target.getChildren())
    {
        if (BaseTypeId.CMIS_DOCUMENT.equals(cmisObject.getBaseTypeId()))
        {
            Document doc =( Document ) cmisObject;
            if(doc.getName().endsWith( ".pdf" ))
                documentList.add( doc);
            System.out.println("[Docment] " + cmisObject.getName());
        }
    }

    return  documentList ;
}

这是我想要达到的目标:

public List< Document > retrieveAllPdfInFolder( Folder target, boolean all )
{
    OperationContext operationContext = OperationContextUtils.createOperationContext();
    Set<String> propertyFilter = new HashSet<String>();
    propertyFilter.add( PropertyIds.CONTENT_STREAM_MIME_TYPE);
    operationContext.setFilter( propertyFilter );
    operationContext.setFilterString(  ".pdf" );
    // i dont know how to set filter on operationContext

    List< Document > finalDocumentList = GenericsUtil.makeList();

    ItemIterable< CmisObject > documents = all ? target.getChildren() :  target.getChildren(operationContext);
    for (CmisObject cmisObject: documents)
    {
        if (BaseTypeId.CMIS_DOCUMENT.equals(cmisObject.getBaseTypeId()))
            finalDocumentList.add( ( Document ) cmisObject);
    }

    return  finalDocumentList ;   
}

【问题讨论】:

    标签: java alfresco alfresco-share opencmis


    【解决方案1】:

    您可以使用 CMIS 查询。像这样的东西应该可以工作:

    QueryStatement stmt = session.createQueryStatement("IN_FOLDER(?) AND cmis:contentStreamMimeType=?");
    stmt.setString(1, target.getId());
    stmt.setString(2, "application/pdf");
    
    ItemIterable<CmisObject> documents = session.queryObjects("cmis:document", stmt.toString(), false, session.getDefaultContext());
    
    for (CmisObject cmisObject: documents)
    {
      finalDocumentList.add((Document)cmisObject);
    }
    

    【讨论】:

    • 很高兴知道如何设置操作上下文过滤器。我必须过滤掉多种基本类型。
    【解决方案2】:

    您应该尝试使用 lucene 搜索。如果是 API,您可以使用 webscript 而不是 CMIS,因为我不确定如何在 CMIS API 中使用 lucene 搜索。

    以下链接将帮助您搜索 PDF 类型的内容。在 Lucene 查询中您可以指定 mimetype。因此它只会返回那些 PDF 类型的文档。

    https://forums.alfresco.com/forum/developer-discussions/other-apis/lucene-query-mimetype-10022007-1608

    lucene 搜索请看下面的代码。

    var parentFolder=search.luceneSearch("PATH:\"/app:company_home/st:sites\"");
    

    这就是它返回站点节点的方式。

    如需了解更多有关 lucene 搜索的知识,您可以在以下链接中找到。

    https://wiki.alfresco.com/wiki/Full_Text_Search_Query_Syntax

    【讨论】:

    • 我没用过lucene搜索,可以给我一个例子吗?
    • 再一次的事情 search.luceneSearch("PATH:\"/app:company_home/st:sites\"") 代码将返回数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2018-04-19
    • 2021-09-05
    • 1970-01-01
    • 2021-01-13
    • 2019-08-06
    • 2019-07-02
    相关资源
    最近更新 更多