MarkLogic:在搜索文档时,其他查询无效

时间:2017-11-02 12:27:27

标签: marklogic marklogic-8

我们正在尝试使用元素范围索引跨文档检索特定元素的不同值。我们希望结果仅限于属于特定集合的文档。

文档在逻辑上被隔离到不同的集合中 - 比如“basedata”集合,它包含所有应用程序基础数据文档和“transactiondata”集合,它将所有传入/传出事务保存到我们的应用程序中。

现在的要求是将范围索引限制为仅仅基础数据集文档而不是事务数据集合文档。

  1. entityName
  2. 创建元素范围索引

    2。  写下以下代码,使用 search:range

    的元素范围索引
    String valueOptionString = 
        " <search:options xmlns:search="http://marklogic.com/appservices/search">
        <search:values name="entityName">
            <search:range type="xs:string">
                <search:element name="entityName"/>
            </search:range>
        </search:values>
        <search:additional-query>
            <cts:collection-query xmlns:cts="http://marklogic.com/cts">
                <cts:uri>basedata</cts:uri>
            </cts:collection-query>
        </search:additional-query>
    </search:options> ";    
    
    QueryManager queryMgr = client.newQueryManager();
        QueryOptionsManager optionsMgr = client.newServerConfigManager().newQueryOptionsManager();
        optionsMgr.writeOptions("DistinctValues", new StringHandle(valueOptionString));
    
        ValuesDefinition vdef = queryMgr.newValuesDefinition("entityName", "DistinctValues");
        ValuesHandle vh = queryMgr.values(vdef, new ValuesHandle());
    
        for (CountedDistinctValue value : vh.getValues()) {
            System.out.println("Distinct value is :: " +
                value.get("xs:string", String.class));
        }
    

    上述代码应该仅将结果限制为 basedata 集合中的文档,但不能按预期工作

    基础数据集合中的文档:

    <?xml  version="1.0" encoding="UTF-8"?>
    <entity>
        <entityName>Company</entityName>
        <createdBy>CompanyOwner</createdBy>
        <createdDate>2017-01-01T05:56:35.360Z</createdDate>
        <status>Active</status>
        <entityattributes>
            <entityattribute>
            </entityattribute>
        </entityattributes>
    </entity>
    

    transactiondata集合中的文档:

    <?xml  version="1.0" encoding="UTF-8"?>
    <entity>
        <entityName>DistinctValueTestEntity</entityName>
        <createdBy>DistinctValuteSystemNew</createdBy>
        <createdDate>2017-01-03T05:56:35.360Z</createdDate>
        <status>Active</status>
        <entityattributes>
            <entityattribute>
            </entityattribute>
        </entityattributes>
    </entity>
    

    Java代码的输出:

    Company,DistinctValueteSystemNew
    

    上述结果是错误的,因为不应考虑DistinctValueteSystemNew,因为我没有在 cts:uri

    中包含 transactiondata 集合

1 个答案:

答案 0 :(得分:1)

查询选项中定义的查询仅适用于搜索请求,而不适用于值请求。

您可以使用setQueryDefinition()方法在值定义上设置查询,从而使用查询约束值请求:

http://docs.marklogic.com/javadoc/client/com/marklogic/client/query/ValuesDefinition.html#setQueryDefinition-com.marklogic.client.query.ValueQueryDefinition-

查询可以包含集合查询。在示例中:

<search:query>
  <search:collection-query>
    <search:uri>basedata</search:uri>
  </search:collection-query>
</search:query>

有关详细信息,请参阅:

http://docs.marklogic.com/guide/search-dev/structured-query#id_76890

希望有帮助,