使用 Cloudant 客户端搜索 API 没有 Return 所有预期的结果

Using Cloudant Client Search API Doesn't Return All Results Expected

我是 Cloudant 的新手,但在 DB2 上使用 SQL 开发了一段时间。我 运行 遇到一个问题,我认为我正在使用 Lucene 查询引擎和 Cloudant 索引来 return 我的查询结果,但三个预期字段中只有两个是 return荷兰国际集团数据。不是 returning 数据的字段是一个数组。我们的应用程序 运行ning Java 并使用 IBM 的 Bluemix 和 WebSphere Liberty Profile 执行。我已经打包了 cloudant-client-2.8.0.jar 和 cloudant-HTTP-2.8.0.jar 文件来访问 cloudant 数据库。我们有许多正在运行的查询,因此连接本身很好。

这是我访问 Cloudant 的代码 API:

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

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

这里是 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;
}

正如您从上面的 java 代码中看到的那样,我使用 java 对象 DocTypeInfo.class 来保存从搜索中 return 编辑的数据。这是 class:

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;
    }       

}

我使用 Cloudant 仪表板设置了设计文档和索引,如下所示:

{
"_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});
           }
         }
       }
     }
   }"
  }
  }
 }

当我执行搜索时,docType 和版本字段被填充,但是 isPublishedForReports 字段始终为 null 或 return。当我在 Cloudant 仪表板中针对索引 运行 查询时,我可以看到 isPublishedForReports 值是 returned,我不知道为什么它没有填充到对象中?也许我误解了这些是如何构建的?

这是我查询数据库的截图,我可以看到我想要的结果:

请帮忙! -道格

我认为您正在访问 result.rows 中每一行的 docs 属性,而不是 fields 属性。当您 运行 使用 .includeDocs(true) 进行搜索时,您将看到类似于以下内容的结果:

{
  "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":[...]
      }
    }
    ...
  ]
} 

请注意如何在 fields 属性 中查看您在搜索索引中定义的字段以及在 doc 属性 中查看完整文档。完整文档不包括 isPublishedForReports.

要获得 isPublishedForReports 值,您需要访问 fields 属性:

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

此外,如果您不需要整个文档,您可以设置 .includeDocs(false) 并仅访问 fields 属性.