2017-06-03 47 views
1

{「uuid」:121222151,「path」:「/aaa/bbb/ccc.json」,「name」:「newDoc1」, 「uuid」:121222152,「path 「:」/aaa/ddd.json「,」name「:」newDoc1「}MarkLogic-如何在structuredQueryBuilder中使用和不存在

我正在使用StructuredQueryBuilder來搜索結果。

StructuredQueryBuilder queryBuilder = new StructuredQueryBuilder(); 
StructuredQueryDefinition containPositiveQuery = queryBuilder.containerQuery(queryBuilder.jsonProperty("name"), queryBuilder.term("newDoc1")); 
StructuredQueryDefinition containNegativeQuery = queryBuilder.containerQuery(queryBuilder.jsonProperty("path"), queryBuilder.term("*/bbb/*")); 
StructuredQueryDefinition containQuery = qb.andNot(containPositiveQuery, containNegativeQuery); 

我想要的結果搜索名爲「newDoc1」,而不是其中包含「*/BBB/*」的路徑。上面的代碼不起作用。可能是什麼原因?

回答

1

您的示例JSON文檔是平坦的。沒有嵌套對象。因此沒有容器可供查詢。爲了實現自己的目標,我猜你的文件將需要看起來更像是這樣的:

{ "container": { 
    "uuid": 121222151, 
    "path": "/aaa/bbb/ccc.json", 
    "name": "newDoc1" 
    }, 
    "container": { 
    "uuid": 121222152, 
    "path": "/aaa/ddd.json", 
    "name": "newDoc1" 
    } 
} 

,且查詢更多這樣的:

StructuredQueryBuilder queryBuilder = new StructuredQueryBuilder(); 
StructuredQueryDefinition positiveQuery = queryBuilder.term("newDoc1"); 
StructuredQueryDefinition negativeQuery = queryBuilder.term("*/bbb/*"); 
StructuredQueryDefinition containQuery = 
    queryBuilder.containerQuery(queryBuilder.jsonProperty("container"), 
    qb.andNot(positiveQuery, negativeQuery)); 

我現在不能完全測試,但希望這可以讓你朝着正確的方向前進。

1

你是否爲路徑屬性打開了通配符索引?如果沒有,您可能想要在路徑屬性中創建一個字段,並僅爲該字段打開通配符索引。

要了解通配符搜索,請參閱:

http://docs.marklogic.com/guide/search-dev/wildcard

打開通配符特定領域有道理的,如果你只需要通配符爲JSON屬性。