听起来您需要首先在所有文本字段上创建 $text 索引,因为它会对使用文本索引索引的字段的内容执行文本搜索:
db.sw_api.createIndex({
"value_chain.category" : "text",
"value_chain.hpe_level0" : "text",
"value_chain.hpe_level1" : "text",
"value_chain.hpe_level2" : "text",
"value_chain.hpe_level3" : "text"
}, { "name": "value_chain_text_idx"});
你创建的索引是一个由5列组成的复合索引,如果你不覆盖mongo默认会自动为你创建文本命名空间。如上,如果不指定索引名称为
db.sw_api.createIndex({
"value_chain.category" : "text",
"value_chain.hpe_level0" : "text",
"value_chain.hpe_level1" : "text",
"value_chain.hpe_level2" : "text",
"value_chain.hpe_level3" : "text"
});
有一个潜在的错误"ns name is too long (127 byte max)",因为文本索引如下所示:
"you_db_name.sw_api.$value_chain.category_text_value_chain.hpe_level0_text_value_chain.hpe_level1_text_value_chain.hpe_level2_text_value_chain.hpe_level3_text"
因此,如果由 mongo 自动生成,则需要给它一个不会太长的名称。
创建索引后,db.sw_api.getIndexes() 查询将显示存在的索引:
/* 1 */
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "dbname.sw_api"
},
{
"v" : 1,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"name" : "value_chain_text_idx",
"ns" : "dbname.sw_api",
"weights" : {
"value_chain.category" : 1,
"value_chain.hpe_level0" : 1,
"value_chain.hpe_level1" : 1,
"value_chain.hpe_level2" : 1,
"value_chain.hpe_level3" : 1
},
"default_language" : "english",
"language_override" : "language",
"textIndexVersion" : 3
}
]
创建索引后,您可以进行 $text 搜索:
db.sw_api.find({ "$text": { "$search": "gift" } })