Couchdb,Mango查询和索引

R.M*_*ith 3 indexing couchdb-mango couchdb-2.0

当用户想要搜索数据库时,我使用Couchdb进行Mango查询.他们可以搜索文档中的多个字段.

为了简化,我有一个包含三个字段的文档,所有这些字段都可以搜索以查找文档.

FieldOne: cow
FieldTwo: pig
FieldThree: dog
Run Code Online (Sandbox Code Playgroud)

为查询创建芒果索引时,我应该使用哪些字段?我应该用多个字段创建和索引吗?订单重要吗?

在字段中还定义了三种不同的文档类型(A,BC).我只需要搜索一个,是否可以从索引中排除其他类型以使其更快?

Field_Type: A
Run Code Online (Sandbox Code Playgroud)

能够针对视图运行索引以仅搜索我感兴趣的文档是有意义的.这可能吗?

示例索引

已知出现在查询中的字段上的一个索引

  {
       "index": {
          "fields": [
             "FieldOne"
          ]
       },
       "name": "foo-json-index",
       "type": "json"
    }
Run Code Online (Sandbox Code Playgroud)

多个索引,不确定是否使用?

 {
       "index": {
          "fields": [
             "FieldOne",
             "FieldTwo",
             "FieldThree"
          ]
       },
       "name": "foo-json-index",
       "type": "json"
    }
Run Code Online (Sandbox Code Playgroud)

或者多个索引在构建查询时选择正确的索引?

获得最快搜索结果的正确方法是什么?

Wil*_*ley 7

我不认为你可以在一般情况下轻松解决这个问题 - 你需要一个特定的选择器(或一组选择器)进行优化.但是,创建可能有帮助的索引时需要考虑以下三个方面:

  1. 创建Mango索引时,只有包含所有索引字段的文档才会包含在索引中.您引用的第二个索引示例(包含所有3个字段)完全没问题,只要您始终在查询选择器中指定所有3个字段即可.

  2. 在查询时,只有在根据选择器需要存在所有索引字段时才能使用索引.例如,如果您的索引包含字段A和B,但您只查询A,则我们无法使用索引,因为它不包含包含A但不包含A的文档.

  3. 索引中的字段顺序很重要.只有当索引可以为索引字段找到连续的值范围时才能使用索引 - 与_view的复合键相同.例如,假设您在字段A和B以及文档上有索引[{A:1,B:1},{A:1,B:2},{A:2,B:1},{A:2,B:2}].索引将如下所示:[[1,1],[1,2],[2,1],[2,2]].如果您的查询是A >= 1 AND B == 2,那么匹配文档([1,2][2,2])覆盖所有匹配文档的唯一范围是[1,2],[2,1],[2,2]]- 该值[2,1]需要在内存中过滤掉.

您可以看到使用_explain端点使用什么索引来完成查询,这应该为您提供一些关于索引对给定选择器的选择性的线索.