mongodb dirver for java【Text Search】

41 篇文章 1 订阅

环境

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/

MongoDB支持对字符串文本内容执行text search查询操作。
MongoDB使用text index(文本索引)和$text操作符来执行text search(文本搜索)。
换言之就是,要使用MongoDBtext 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 indexrestaurants集合中。

MongoCollection<Document> collection = database.getCollection("restaurants");
collection.createIndex(Indexes.text("name"));

要执行文本搜索,可以使用Filters.text()助手来指定文本搜索过滤器。

例如:下面代码在name字段中执行文本搜索,查询bakerycoffee

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中查看以下部分:

$text query operator
text index
Text Search Languages

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值