加速Cloudant查询类型文本索引

时间:2017-11-30 13:48:31

标签: couchdb cloudant

我们有一个这种结构的表:

 {_id:15_0, createdAt: 1/1/1, task_id:[16_0, 17_0, 18_0], table:”details”, a:b, c: d, more}

我们使用

创建了索引
 { 
   "index": {}, 
   "name": "paginationQueryIndex", 
   "type": "text" 
 }

自动创建

 {
  "ddoc": "_design/28e8db44a5a0862xxx",
  "name": "paginationQueryIndex",
  "type": "text",
  "def": {
    "default_analyzer": "keyword",
    "default_field": { 
    },
    "selector": {    
    },
    "fields": [      
    ],
    "index_array_lengths": true
  }
 }

我们正在使用以下查询

{ 
  "selector": { 
   "createdAt": { "$gt": 0 }, 
   "task_id": { "$in": [ "18_0" ] }, 
   "table": "details" 
  }, 
  "sort": [ { "createdAt": "desc" } ], 
  "limit”: 20 
 }

第一次需要700-800毫秒,之后会减少到500-600毫秒

为什么第一次需要更长的时间?

有什么方法可以加快查询速度?

如果type是“text”,是否可以将索引添加到特定字段? (而不是索引这些记录中的所有字段)

1 个答案:

答案 0 :(得分:1)

您可以尝试更明确地创建索引,定义您希望索引的每个字段的类型,例如:

{
  "index": {
    "fields": [
      {
        "name": "createdAt",
        "type": "string"
      },
      {
        "name": "task_id",
        "type": "string"
      },
      {
        "name": "table",
        "type": "string"
      }
    ]
  },
  "name": "myindex",
  "type": "text"
}

然后您的查询变为:

{ 
  "selector": { 
    "createdAt": { "$gt": "1970/01/01" }, 
    "task_id": { "$in": [ "18_0" ] }, 
    "table": "details" 
  }, 
  "sort": [ { "createdAt": "desc" } ], 
  "limit": 20 
}

请注意,我使用了数据类型为字符串的字符串。

如果您对性能感兴趣,请尝试一次从查询中删除子句,以查看是否导致性能问题。您还可以查看查询的explanation,看它是否正确使用您的索引。

有关创建显式文本查询索引的文档是here