环境
MongoDB:3+
mongodb dirver for java:3.4
概要
text search
支持某个字段内容进行查询。比如:字段content
字段记录的是本章的内容。现在想要查询这篇文章的内容是否有中国
这个字符串,这时就要用到text search
。
本篇讲的是在java
中如何使用。之后我还会讲解MongoDB
中本身的语法。
以下翻译之官网:
https://mongodb.github.io/mongo-java-driver/3.4/driver/tutorials/text-search/
Text Search
MongoDB
支持对字符串文本内容执行text search
查询操作。
MongoDB使用text index
(文本索引)和$text
操作符来执行text search
(文本搜索)。
换言之就是,要使用MongoDB
的text search
功能就要:
①创建文本索引
②使用$text
操作符
java驱动提供了Filters.text()
助手来方便创建文本搜索查询过滤器。
先决条件
下面的例子必须要在test
数据库中有一个restaurants
集合。
(你也可以使用本地的测试环境的集合,不一定非要安装官网的来。我自己就是用公司的测试环境来实践的)
你可能需要import
的声明有:
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Indexes;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Sorts;
import com.mongodb.client.model.TextSearchOptions;
import org.bson.Document;
下面这段代码是在教程示例中将会打印文本搜索的结果的。
Block<Document> printBlock = new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document.toJson());
}
};
注: Block
是个接口,这个使用了匿名内部类的方式实现该接口。
连接MongoDB服务器
这里我就直接贴代码
//连接数据库 start
MongoCredential credential =
//这里写你自己的用户名、数据库名和密码
MongoCredential.createCredential("gg_openapi",
"gg_openapi",
"gg..openapi#!".toCharArray());
ServerAddress serverAddress;
//这里写你自己的地址
serverAddress = new ServerAddress("106.75.51.20", 35520);
List<ServerAddress> addrs = new ArrayList<ServerAddress>();
addrs.add(serverAddress);
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(credential);
@SuppressWarnings("resource")
MongoClient mongoClient = new MongoClient(addrs, credentials);
MongoDatabase database = mongoClient.getDatabase("gg_openapi");
System.out.println("Connect to database successfully");
//连接数据库 end
创建 text 索引
要创建text index
(文本索引),可以使用Indexes.text
静态助手来创建一个规范的文本索引并传给MongoCollection.createIndex()
方法。
下面的例子是在name
字段上创建text index
在restaurants
集合中。
MongoCollection<Document> collection = database.getCollection("restaurants");
collection.createIndex(Indexes.text("name"));
执行text search
要执行文本搜索,可以使用Filters.text()
助手来指定文本搜索过滤器。
例如:下面代码在name
字段中执行文本搜索,查询bakery
或coffee
。
long matchCount = collection.count(Filters.text("bakery coffee"));
System.out.println("Text search matches: " + matchCount);
打印的结果:
Text search matches: 2
关于在文本搜索更多信息,可以看$text operator。
Text Score
对于每个匹配的文档,文本搜索会分配一个数字(或者叫分数),代表文档与指定文本搜索查询过滤器的相关程度。通俗点说,匹配后的文档中,越和查询条件相近的,分数就越大。
要返回并按数字进行排序,那么就要在映射(projection)文档和排序(sort)表达式中使用$meta
操作符。
collection.find(Filters.text("bakery cafe"))
.projection(Projections.metaTextScore("score"))
.sort(Sorts.metaTextScore("score"))
.forEach(printBlock);
指定 文本搜索 选项
Filters.text()
助手能够接受text search options
变量。
java
驱动提供了TextSearchOptions
类来指定这些选项。
例如,下面在执行文本搜索单词cafe
时,指定了text search language
选项。
long matchCountEnglish = collection.count(Filters.text("cafe", new TextSearchOptions().language("english")));
System.out.println("Text search matches (english): " + matchCountEnglish);
输出的结果:
Text search matches (english): 1
有关文本搜索的更多信息可以在MongoDB Server Manual
中查看以下部分: