一、准备工作
这里准备一些数据
db.books.insertMany([
{_id: 1, name: "Java", description: "java 入门图书", translation: [{ language: "english", description: "java basic book" }]},
{_id: 2, name: "C++", description: "C++ 入门图书", translation: [{ language: "english", description: "c++ basic book" }]},
{_id: 3, name: "Java设计模式", description: "java 设计模式", translation: [{ language: "english", description: "c++ design mode" }]}
]);
二、创建索引
1、创建索引
db.books.createIndex({description: 'text'});
上面创建了description字段的文本索引
2、查询索引
db.books.getIndexes();
结果如下:
可以看到多了一个名称为description_text的索引;另外可以看到索引中有权重(weights)、默认语言(default_language)、指定语言字段(language_override)、文本索引版本(textIndexVersion)
三、示例:使用英文查询
1、执行查询
db.books.find ({$text: { $search: 'java'}});
结果如下:
2、执行过程
db.books.find ({$text: { $search: 'java'}}).explain();
结果如下:
可以看到查询过程中会使用到索引名称为description_text的索引
四、示例:使用中文查询
1、执行查询
db.books.find ({$text: { $search: '入门语言'}});
结果如下:
2、执行过程
db.books.find ({$text: { $search: '入门语言'}}).explain();
结果如下:
可以看到查询过程中会使用到索引名称为description_text的索引
五、示例:使用中文查询
1、执行查询
db.books.find ({$text: { $search: '入门'}});
查询不到任何结果
2、执行过程
db.books.find ({$text: { $search: '入门'}}).explain();
结果如下:
可以看到查询过程中会使用到索引名称为description_text的索引
3、分析
在创建文本索引时,会先对文本进行分词,根据分词后的结果建立索引;这里分词使用的是空格,所以使用java或者入门语言进行搜索时都可以查询到结果,而使用入门进行搜索时却无法查询到任何数据。