2017-12-27 29 views
0

내가 1 개 백만 문서까지 우리는 검색을 수행하는 Java 클라이언트 API 및 구조화 된 쿼리를 사용하는 2시간MarkLogic 쿼리 Peformance

에서 가져와야하는 응용 프로그램 작업을하고 구조화. 그러나 쿼리가 여전히 느립니다.

코드는 다음과 같습니다 :

def fetchPostMessages(dbParam: DbParam): Page = { 

    val queryManager = dbClient.newQueryManager() 
    val sqb: StructuredQueryBuilder = queryManager.newStructuredQueryBuilder() 

    log.info(s "Fetching post messages from database for params: {}", dbParam) 

    val modifiedQueryDef = dbParam.param.map { 
    param => { 
     sqb.and(
     sqb.word(sqb.jsonProperty(status), toBeReported), 
     sqb.word(sqb.jsonProperty(dataCategory), "dataCategory1"), 
     sqb.range(sqb.jsonProperty(creationDate), marklogicDateFormat.name, Operator.LE, DateUtil.printFpmlDateTime(param.messagesTime))) 

    } 
    }.getOrElse(sqb.and(sqb.word(sqb.jsonProperty(status.name), toBeReported.name))) 

    modifiedQueryDef.setCollections(XmlConstants.ItracMessageTypes.OUTPUT_MESSAGE.name) 
    modifiedQueryDef.setOptionsName(sortOption) 
    search(modifiedQueryDef, dbParam.pageNum, dbParam.batchSize) 
} 


private def search(queryDef: QueryDefinition, startIndex: Int, batchSize: Int): Page = { 

    val dataList: ListBuffer[Document] = new ListBuffer() 
    val jsonDocManager = dbClient.newJSONDocumentManager() 
    jsonDocManager.setMetadataCategories(Metadata.ALL) 
    jsonDocManager.setPageLength(
    if (batchSize < pageLength) batchSize 
    else pageLength) 
    val documentPage = jsonDocManager.search(queryDef, startIndex); 
    dataList.++ = (extractContent(documentPage)) 

    val totalSize = documentPage.getTotalSize 
    log.info(s "Total documents to be reported : ${totalSize}") 
    var pageSize = documentPage.getPageSize 

    while (pageSize < batchSize && pageSize <= totalSize) { 

    if (batchSize - pageSize < pageSize) 
     jsonDocManager.setPageLength(batchSize - pageSize) 

    var newDocPage = jsonDocManager.search(queryDef, pageSize + 1) 
    dataList.++ = (extractContent(newDocPage)) 
    pageSize = pageSize + newDocPage.getPageSize 
    } 

    log.info("Total messages fetched are : {}", dataList.size) 
    Page(startIndex, totalSize - batchSize, dataList.to[collection.immutable.Seq]) 

} 

정렬 옵션은 다음과 같습니다 데이터베이스에

<search:options xmlns:search="http://marklogic.com/appservices/search"> 
    <search:sort-order type="xs:string" direction="ascending"> 
    <search:json-property>subdomLvl1</search:json-property> 
    </search:sort-order> 
    <search:sort-order type="xs:string" direction="ascending"> 
    <search:json-property>trdId</search:json-property> 
    </search:sort-order> 
    <search:sort-order type="xs:string" direction="ascending"> 
    <search:json-property>validStartDate</search:json-property> 
    </search:sort-order> 
    <search:sort-order type="xs:string" direction="ascending"> 
    <search:json-property>ver</search:json-property> 
    </search:sort-order> 
    <search:sort-order type="xs:string" direction="ascending"> 
    <search:json-property>reportStatus</search:json-property> 
    </search:sort-order> 
</search:options> 

인덱싱은 다음과 같습니다 :

요소 범위 인덱스는 동안이다 -, dataCategory 및 상태 creationDate 및 모든 정렬 옵션에 대해

답변

1

프로세스에 docume이 필요하지 않은 경우 jsonDocManager.setMetadataCategories (Metadata.ALL) 대신 jsonDocManager.clearMetadataCategories()를 사용하여 구성하는 것이 좋습니다. 이 방법을 사용하면 서버 및 클라이언트 작업이 줄어들뿐만 아니라 전송되는 데이터가 줄어 듭니다.

는 루프가 newDocPage.hasNextPage()를 테스트하여 단순화 할 수

- 참조 :

http://docs.marklogic.com/guide/java/bulk#id_21619

대신 하나의 목록에있는 모든 만 문서를 축적, 클라이언트가 소비하는 프로세스로에 문서를 스트리밍 할 수 있습니다 그들은 도착합니까? 확실히 처리량을 향상시킬 것입니다.

또한 여러 스레드에서 문서를 읽을 수있는 데이터 이동 SDK를 사용하는 것이 좋습니다 :이 도움이 기대

http://docs.marklogic.com/guide/java/data-movement#id_60613

http://docs.marklogic.com/javadoc/client/com/marklogic/client/datamovement/QueryBatcher.html