【问题标题】:MarkLogic: additional-query not working while searching documentsMarkLogic:搜索文档时附加查询不起作用
【发布时间】:2017-11-02 12:27:26
【问题描述】:

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

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

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

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

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>

事务数据集合中的文档:

<?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

上述结果是错误的,因为我没有在 cts:uri

中包含 transactiondata 集合,因此不应考虑 DistinctValueteSystemNew

【问题讨论】:

    标签: marklogic marklogic-8


    【解决方案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

    希望对您有所帮助,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 2013-12-07
      • 2014-04-05
      • 1970-01-01
      相关资源
      最近更新 更多