如何使用golang和mongo-go-driver在mongodb中创建文本索引?

时间:2019-06-25 17:17:27

标签: mongodb go

我正在尝试对集合进行全文搜索,但是为此,我需要创建一个文本索引。 如何在两个字段上创建文本索引?

我知道我必须使用这样的东西:

opts := options.CreateIndexes().SetMaxTime(10 * time.Second)

idxFiles := []mongo.IndexModel{
    {
      Keys: bsonx.Doc{{"name": "text"}},
    },
  }

db.Collection("mycollection").Indexes().CreateMany(context, idx, opts)

5 个答案:

答案 0 :(得分:0)

要使用正式的mongo go驱动程序创建索引,可以使用以下代码:

// create Index
indexName, err := c.Indexes().CreateOne(
        context.Background(),
        mongo.IndexModel{
                Keys: bson.M{
                        "time": 1,
                },
                Options: options.Index().SetUnique(true),
        },
)
if err != nil {
        log.Fatal(err)
}
fmt.Println(indexName)

您可以将其替换为所需的索引配置。

答案 1 :(得分:0)

我已经找到了解决方案:

    coll := db.Collection("test")
    index := []mongo.IndexModel{
        {
            Keys: bsonx.Doc{{Key: "name", Value: bsonx.String("text")}},
        },
        {
            Keys: bsonx.Doc{{Key: "createdAt", Value: bsonx.Int32(-1)}},
        },
    }

    opts := options.CreateIndexes().SetMaxTime(10 * time.Second)
    _, errIndex = coll.Indexes().CreateMany(context, index, opts)
    if err != nil {
        panic(errIndex)
    }

答案 2 :(得分:0)

MongoDB indexes documentation中,我编写了一个函数,用于为支持的所有MongoDB类型创建索引。

func AddIndex(dbName string, collection string, indexKeys interface{}) error {
    db := getNewDbClient() // get clients of mongodb connection
    serviceCollection := db.Database(dbName).Collection(collection)
    indexName, err := serviceCollection.Indexes().CreateOne(mtest.Background, mongo.IndexModel{
        Keys: indexKeys,
    })
    if err != nil {
        return err
    }
    fmt.Println(indexName)
    return nil
}

mongodb单字段索引

AddIndex("mydb", "mycollection", bson.M{"myfieldname": 1}) // to descending set it to -1

mongodb复合索引

AddIndex("mydb", "mycollection", bson.D{{"myFirstField", 1},{"mySecondField", -1}}) // to descending set it to -1

mongodb文本索引

AddIndex("mydb", "mycollection", bson.D{{"myFirstTextField", "text"},{"mySecondTextField", "text"}})

答案 3 :(得分:0)

使用地理空间(2dsphere)、文本和单个字段。

models := []mongo.IndexModel{
    {
        Keys: bsonx.Doc{{Key: "username", Value: bsonx.String("text")}},
    },
    {
        Keys: bsonx.Doc{{Key: "NearCoordinates", Value: bsonx.String("2dsphere")}},
    },
    {
        Keys: bsonx.Doc{{Key: "password", Value: bsonx.Int32(1)}},
    },
}
opts := options.CreateIndexes().SetMaxTime(20 * time.Second)
_, err := collectionName.Indexes().CreateMany(context.Background(), models, opts)

答案 4 :(得分:0)

您可以简单地创建具有自定义选项和权重的文本索引,如下所示:

mod := mongo.IndexModel{
    Keys: bson.D{
        {"title", "text"},
        {"description", "text"},
    },
    // create UniqueIndex option
    Options: options.Index().SetWeights(bson.D{
        {"title", 9},
        {"description", 3},
    }),
}

collection.Indexes().CreateOne(context.Background(), mod)