2017-10-03 2 views
0

Je suis assez nouveau dans Cloudant, mais j'ai développé SQL Server sur DB2 depuis un certain temps. Je rencontre un problème où je pense que j'utilise le moteur de requête Lucene et les index Cloudant pour retourner les résultats de ma requête, mais seulement deux des trois champs attendus retournent des données. Le champ qui ne renvoie pas de données est un tableau. Notre application exécute Java et est exécutée à l'aide des logiciels IBM Bluemix et WebSphere Liberty Profile. J'ai empaqueté les fichiers cloudant-client-2.8.0.jar et cloudant-HTTP-2.8.0.jar pour accéder à la base de données cloudant. Nous avons beaucoup de requêtes qui fonctionnent donc la connexion elle-même est bien.L'utilisation de l'API Cloudant Client Search ne renvoie pas tous les résultats attendus

Voici mon code qui accède à l'API Cloudant:

.... 
Search searchSaaSData = ServiceManagerSingleton.getInstance().getSaaSCapabilitiesDatabase().search("versioning-ddoc/versioning-indx").includeDocs(true); 

SearchResult<DocTypeInfo> result = searchSaaSData.querySearchResult(this.getJsonSelector(deliverableId), DocTypeInfo.class); 
.... 

Voici le code this.getJsonSelector:

private String getVersioningSearch(String deliverableId) { 
    String query = ""; 
    if (deliverableId != null && !deliverableId.isEmpty()) { 
     // Search based on deliverableId 
     query += "("; 
     query += "deliverableId:\"" + deliverableId + "\"" + ")"; 
    } 

    logger.log(Level.INFO, "Search query is: " + query); 
    // The query is simple, will look like this: 
    // deliverableId:"0B439290AB5011E6BE74C84817AAB206") 

    return query; 
} 

Comme vous pouvez le voir dans le code java ci-dessus, je suis en utilisant le java object DocTypeInfo.class pour contenir les données renvoyées à partir de la recherche. Voici la classe:

public class DocTypeInfo { 
    private final String docType; 
    private final String version; 
    private String isPublishedForReports; 

    public DocTypeInfo(String docType, String version) { 
     this.docType = docType; 
     this.version = version; 
    } 

    /** 
    * @return the docType 
    */ 
    private String getDocType() { 
     return docType; 
    } 

    /** 
    * @return the version 
    */ 
    private String getVersion() { 
     return version; 
    } 

    /** 
    * @return the isPublishedForReports 
    */ 
    public String getIsPublishedForReports() { 
     return isPublishedForReports; 
    } 

    /** 
    * @param isPublishedForReports the isPublishedForReports to set 
    */ 
    public void setIsPublishedForReports(String isPublishedForReports) { 
     this.isPublishedForReports = isPublishedForReports; 
    }  

} 

J'ai installé un document de conception et de l'index en utilisant le tableau de bord Cloudant comme suit:

{ 
"_id": "_design/versioning-ddoc", 
"_rev": "22-0e0c0ccfc2b5fe7245352da7e5b1ebd3", 
"views": {}, 
"language": "javascript", 
"indexes": { 
    "versioning-indx": { 
    "analyzer": { 
    "name": "perfield", 
    "default": "standard", 
    "fields": { 
     "deliverableId": "whitespace", 
     "docType": "standard", 
     "version": "standard", 
     "isPublishedForReports": "keyword" 
    } 
    }, 
    "index": "function (doc) { 
       index(\"deliverableId\", doc.deliverableId, {\"store\":true, \"boost\":1.0}); 
    index(\"docType\", doc.docType, {\"store\":true, \"boost\":1.0}); 
    index(\"version\", doc.version, {\"store\":true, \"boost\":1.0}); 
    if (Array.isArray(doc.publishSettings)) { 
    for (var i in doc.publishSettings) { 
     if (doc.publishSettings[i].options) { 
     for (var j in doc.publishSettings[i].options) { 
      index(\"isPublishedForReports\", doc.publishSettings[i].options[j].optionId, {\"store\":true, \"boost\":1.0}); 
      } 
     } 
     } 
    } 
    }" 
    } 
    } 
} 

Quand je lancer la recherche des champs de Doctype et version sont renseignés, mais les isPublishedForReports Le champ est TOUJOURS nul ou ne retourne pas. Lorsque j'exécute une requête dans le tableau de bord Cloudant par rapport à l'index, je peux voir que la valeur isPublishedForReports est renvoyée, je ne sais pas pourquoi elle n'est pas remplie dans l'objet. Peut-être que je ne comprends pas comment ils sont construits?

Voici une capture d'écran où je DB et Interrogation de la je peux voir les résultats que je veux: enter image description here

S'il vous plaît aider! -Doug

Répondre

1

Je pense que vous accédez à la propriété docs de chaque ligne result.rows au lieu de la propriété fields. Lorsque vous exécutez votre recherche avec .includeDocs(true) vous verrez un résultat similaire à ce qui suit:

{ 
    "total_rows":3, 
    "bookmark":"g1AAA", 
    "rows":[ 
    { 
     "id":"263a81ea76528dead3a4185df3676f62", 
     "order":[ 
     1.0, 
     0 
     ], 
     "fields":{ 
     "docType":"xxx", 
     "deliverableId":"yyy", 
     "isPublishedForReports":"pu_1_2" 
     }, 
     "doc":{ 
     "_id":"263a81ea76528dead3a4185df3676f62", 
     "_rev":"3-116dd3831c182fb13c12b05a8b0996e4", 
     "docType":"xxx", 
     "deliverableId":"yyy", 
     "publishSettings":[...] 
     } 
    } 
    ... 
    ] 
} 

Remarquez comment vous pouvez voir les champs que vous avez définis dans l'index de recherche dans la propriété fields et le document dans la propriété doc. Le document complet n'inclut pas isPublishedForReports.

Pour obtenir la valeur isPublishedForReports vous devez accéder à la propriété fields:

for (SearchResult<DocTypeInfo>.SearchResultRow row : result.getRows()) { 
    ... 
    row.getFields().getIsPublishedForReports() 
    ... 
} 

Aussi, si vous n'avez pas besoin tout le doc vous pouvez définir .includeDocs(false) et accéder à la propriété que fields.

+1

Votre droite et moi avons marqué le vôtre comme réponse. Quand je l'ai changé et commencé à accéder aux champs, je peux obtenir ce dont j'ai besoin. Merci pour l'explication aussi bien. Très appréciée. -Doug M. – Doug