2017-04-10 126 views
2

我想要使用ML Java API來運行聚合查詢,並且遇到了一些麻煩。我遵循了文檔,但是有一個值約束的要求,我不確定那應該是什麼樣子。我試過以下內容:使用Java API的Marklogic聚合查詢

String options = 
      "<options xmlns:search=\"http://marklogic.com/appservices/search\">" + 
      " <values name=\"average\">" + 
      "  <range type=\"xs:string\">" + 
      "   <element ns=\"\" name=\"content-id\"/>" + 
      "  </range>" + 
      " </values>" + 
      "</options>"; 

    StringHandle handle = new StringHandle(options); 
    QueryOptionsManager optMgr = client.newServerConfigManager().newQueryOptionsManager(); 
    optMgr.writeOptions("average", handle); 
    QueryManager queryManager = client.newQueryManager(); 
    StructuredQueryBuilder queryBuilder = queryManager.newStructuredQueryBuilder(); 
    ValuesDefinition valuesDefinition = queryManager.newValuesDefinition("average"); 
    valuesDefinition.setAggregate("avg"); 
    valuesDefinition.setQueryDefinition(queryBuilder.value(queryBuilder.element("content-id"),contentId)); 

    ValuesHandle results = queryManager.values(valuesDefinition, new ValuesHandle()); 

我採取了一些基於我正在使用的其他選項的選項刺。但是,當我嘗試編寫它告訴我的選項無效的內容:意外的負載

我感覺我正在以這種錯誤的方式前進。基本上我想查找元素「content-id」中具有給定值的所有文檔,然後獲取另一個名爲「star-rating」的元素的平均值。

應該爲「content-id」還是「star-rating」設置選項?該文檔不顯示使用queryDefinition,我應該刪除它嗎?修改它?在Java中有更簡單的方法嗎?

編輯:忘了提,我也創建了一個元素範圍索引content-id與字符串類型。

+1

你是正確的添加setQueryDefinition過濾「content-id」。但是,您不需要*使用選項按「content-id」中的給定值進行篩選。只需使用queryBuilder.range()而不是queryBuilder.value()。您需要在「」下的選項中選擇「星級評定」,並且您的valuesDefinition應以此爲中心。 –

+0

@SamMefford我更改爲範圍()並修改了選項,並將star-rating替換爲content-id,但出現錯誤,說**無效參數:沒有值或元組規範名爲:star-rating ** –

+0

嘗試谷歌搜索錯誤,但我沒有得到任何東西 –

回答

2

在@SamMefford的指導下,我能夠找到解決方案。它看起來像這樣:

String options = 
      "<options xmlns=\"http://marklogic.com/appservices/search\">" + 
      " <values name=\"star-rating\">" + 
      "  <range type=\"xs:float\">" + 
      "   <element ns=\"\" name=\"star-rating\"/>" + 
      "  </range>" + 
      " </values>" + 
      "</options>"; 

    StringHandle handle = new StringHandle(options); 
    QueryOptionsManager optMgr = client.newServerConfigManager().newQueryOptionsManager(); 
    optMgr.writeOptions("star-rating", handle); 
    QueryManager queryManager = client.newQueryManager(); 
    StructuredQueryBuilder queryBuilder = 
     queryManager.newStructuredQueryBuilder("star-rating"); 
    ValuesDefinition valuesDefinition = queryManager.newValuesDefinition("star-rating"); 
    valuesDefinition.setAggregate("avg"); 
    valuesDefinition.setQueryDefinition(
     queryBuilder.range(
      queryBuilder.element("content-id"),"string", 
      StructuredQueryBuilder.Operator.EQ,contentId 
     ) 
    ); 

    String results = queryManager.values(valuesDefinition, new ValuesHandle()) 
     .getAggregate("avg").getValue(); 

選項是圍繞我想要的平均字段創建的。我爲<星級>和< content-id>創建了元素索引。查詢然後允許我過濾到具有特定內容ID的記錄,然後獲得他們星級的平均值。