3

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

为了简化,我有一个包含三个字段的文档,所有这些字段都可以通过搜索来找到文档。

FieldOne: cow
FieldTwo: pig
FieldThree: dog

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

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

Field_Type: A

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

示例索引

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

  {
       "index": {
          "fields": [
             "FieldOne"
          ]
       },
       "name": "foo-json-index",
       "type": "json"
    }

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

 {
       "index": {
          "fields": [
             "FieldOne",
             "FieldTwo",
             "FieldThree"
          ]
       },
       "name": "foo-json-index",
       "type": "json"
    }

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

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

4

1 回答 1

7

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

  1. 创建 Mango 索引时,只有包含所有索引字段的文档才会包含在索引中。您引用的第二个索引示例包含所有 3 个字段,只要您始终要在查询选择器中指定所有 3 个字段,就可以了。

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

  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]]. 如果您的查询是 then A >= 1 AND B == 2,则匹配文档 ([1,2][2,2]) 覆盖所有匹配文档的唯一范围是[1,2],[2,1],[2,2]]-[2,1]需要在内存中过滤掉该值。

您可以使用端点查看用于完成查询的索引_explain,这应该为您提供一些线索,了解索引对于给定选择器的选择性。

于 2017-11-30T16:55:47.997 回答