mongodb - MongoDB中精确单词文本搜索的问题
问题描述
我想使用以下代码查询 mongodb (3.6) 中的文本条目:
collection.aggregate([{$match:{$text:{$search: "gram"}}}])
在此查询中,将返回如下结果:
[{content:"Telegram is a messaging ...",tags:"Telegram"},
{content:"Instagram is a social ..." tags:"Instagram"},
{content:"gram is a unit of weight", tags:"gram"},
{content:"Mobogram is a shell for telegram", tags:"Mobogram"}]
但期望的结果是:
{ontent: "gram is a unit of weight",tags:"gram"}
这意味着我们正在寻找精确匹配。我将如何更改查询以获得完全匹配?
编辑:
指数为:
weights:{contents:1, tags:1}
default_language:english
language_override:language
这是用这个创建的:
collection.createIndex( { "content": 1, "tags": 1 } )
解决方案
特定短语的语法是:
{ $text: { $search: '\"gram is a unit of weight\"' } }
不幸的是,实际上不可能在单词上搜索完全匹配,这是由于 mongo 使用雪球来词干和索引单词。
但是,您可以尝试在文本搜索中匹配高于某个元分数。
例子:
假设我们有 2 个带有文本字段的文档,一个带有 sleep 一词,另一个带有 sleep 一词。在创建文本索引时,mongo 会为这两个词保存术语“睡眠”。因此,一旦我去搜索术语 sleep,即使我添加了完全匹配的语法,由于索引的性质,两者都将作为匹配返回。
了解 mongo 如何解析某些单词的一个可爱提示是运行:
model.find({$text: {$search: 'sleeping'}}).explain()
这将在winningPlan 对象中返回一个JSON:
{
"terms": [
"sleep"
],
"negatedTerms": [],
"phrases": [],
"negatedPhrases": []
}
现在很容易理解哪些术语将匹配此搜索。
推荐阅读
- c# - 将 PowerBuilder 编写的 DLL 导入和引用到 C#
- html - 当我以移动格式查看此网站时如何打破界限。我使用 Tailwindcss、jinja 和 flask 来生成这个网站
- python - 以文本形式获取 ascii 响应,如何在 Python 中解码
- c++ - C ++ QT在类结构中传递更高消息的最佳方法
- javascript - JS:在叠加层中打开随机视频、图像或链接
- jenkins - 通过 jenkins 上传的 JFrog Artifactory 工件不会出现在构建中
- arrays - 如何在 Ruby 中使用 %w 中的常量?
- spring-boot - 如何在使用 io.confluent 提供的 kafka-schema-registry-maven-plugin 时加密 userInfoConfig 参数?
- android - 为什么在 Android Studio 中从 Firebase 实时数据库读取数据如此缓慢?
- crystal-lang - 在这种情况下,我如何处理好 nil ?