MongoDB:如何进行文本搜索并按日期排序

2024-03-30

上下文:我有一个 MongoDB,里面有大量电子邮件。我想搜索包含以下任意字段中给定电子邮件地址的所有电子邮件:“收件人”、“发件人”、“抄送”和“密件抄送”。结果需要按日期字段排序。我们目前正在尝试以下查询:

db.collection.find({ $text : {$search: "\"[email protected] /cdn-cgi/l/email-protection\""}}).sort({Date:1})

我尝试过创建包含日期的复合索引,但它不起作用。

有了这个指数...

db.collection.createIndex({Date: 1, From:"text", To:"text", CC:"text", BCC:"text"})

它给出错误 17007,因为日期应该具有相等匹配,因为它是前缀。这不是一个选项,因为我们需要所有电子邮件,无论日期如何。

还有这个其他索引...

db.collection.createIndex({From:"text", To:"text", CC:"text", BCC:"text", Date:1})

然后,当它超出排序的内部限制时,它会给出错误 17144。

我们已阅读以下内容:

Stackoverflow 参考 https://stackoverflow.com/questions/19336391/mongodb-text-search-and-order-by

Stackoverflow 参考 https://stackoverflow.com/questions/29058143/mongodb-text-search-filter-by-multiple-fields

关于复合索引的 mongoDB 文档 http://docs.mongodb.org/manual/core/index-text/#compound-index

在这些参考文献和其他参考文献中,我认为这是不可能的,但我不认为我们正在尝试做的事情是非典型的或开箱即用的。

我们做错了什么吗?有没有办法使用复合索引或任何其他 MongoDB 功能来执行此查询?

thanks!


无论其他复合索引键如何,您都需要包含$meta http://docs.mongodb.org/manual/reference/operator/projection/meta/#proj._S_meta对于“textScore”以获得正确的排序:

db.collection.find(
    { "$text": { "$search": "\"[email protected] /cdn-cgi/l/email-protection\""}},
    { "score": { "$meta": "textScore" } }
).sort({
    "score": { "$meta": "textScore" }, "Date": 1
})

因此,您自然希望首先按“分数”排序,然后按“日期”排序,以便根据搜索的相关性对事物进行正确排名。

索引的顺序并不重要,但当然你只能有“一个”文本索引。因此,请确保在创建之前删除所有其他内容:

db.collection.createIndex({ 
   "From": "text",
   "To": "text",
   "CC":"text", 
   "BCC": "text", 
   "Date":1
})

查找当前的索引:

db.collection.getIndicies()

或者干脆放弃一切并重新开始:

db.collection.dropIndexes()

对于您似乎正在搜索的数据,我认为每个字段的常规复合索引应该更适合您。查找“电子邮件”地址应该是“完全匹配”,如果您期望每个字段有多个项目,那么它们应该是字符串数组,如下所示:

{
    "TO": ["[email protected] /cdn-cgi/l/email-protection"],
    "FROM": ["[email protected] /cdn-cgi/l/email-protection"],
    "CC": ["[email protected] /cdn-cgi/l/email-protection","[email protected] /cdn-cgi/l/email-protection"],
    "BCC": [],
    "Date": ISODate("2015-07-27T13:42:05.535Z")
}

然后,您需要在每个字段上使用单独的索引,可以与“日期”复合,如下所示:

db.email.createIndex({ "TO": 1, "Date": 1 })
db.email.createIndex({ "FROM": 1, "Date": 1 })
db.email.createIndex({ "CC": 1, "Date": 1 })
db.email.createIndex({ "BCC": 1, "Date": 1 })

并用一个查询$or http://docs.mongodb.org/manual/reference/operator/query/or/健康)状况:

db.email.find({
    "$or": [
        { "TO": "[email protected] /cdn-cgi/l/email-protection" },
        { "FROM": "[email protected] /cdn-cgi/l/email-protection" },
        { "CC": "[email protected] /cdn-cgi/l/email-protection" },
        { "BCC": "s[email protected] /cdn-cgi/l/email-protection" }
    ],
    "Date": { "$lt": new Date() }
})

如果你看一下.explain(true) http://docs.mongodb.org/manual/reference/method/cursor.explain/(详细)输出,您应该看到获胜计划是所有指定索引的“索引交集”。这非常有效,因为每个字段(和选定的索引)都有一个精确匹配值,以及索引日期的范围匹配。

这比文本搜索的“模糊匹配”对您来说要好得多。一般来说,甚至正则表达式在这里也应该工作得更好(对于电子邮件地址),特别是如果它们是“锚定的”^到字符串的开头。

文本索引用于匹配“类似单词的标记”,但这不应该是您的数据。这$or看起来不太好,但它应该做得更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB:如何进行文本搜索并按日期排序 的相关文章

随机推荐

  • IO 的“最佳”ExecutionContext

    我的 Scala 代码中有一些同步调用 我将它们包装在阻塞 上下文中 然后包装在 Future Future blocking syncCall 中 但我不知道要使用哪种类型的 ExecutionContext 我知道可能有很多可能性 并且
  • 如何更正此错误:未找到数据源名称且未指定默认驱动程序

    我有一个在 Windows 服务器上运行的网站 它运行得很好 我尝试在本地主机中进行复制 但收到错误 Warning odbc connect function odbc connect SQL error Microsoft ODBC D
  • 通过网络发送的数据的字符串压缩/解压缩[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 中的字符串压缩方法 可以在将数据字符串写入网络套接字之前对其运行 我对任何类型的压缩都相当陌生 因此我在这里寻求一些建议
  • GitHub 中的发布到底是什么?

    究竟是什么 它是用来做什么的 使用范围有多广泛 通常如何使用 来自官方GitHub https help github com articles about releases Releases are GitHub s打包并向用户提供软件的
  • 替换每列的最大值

    我有一个矩阵 我想用 1 替换每列的最大值 我怎样才能在R中做到这一点 我试过 set seed 14 mat lt matrix sample 10 20 replace TRUE nr 5 apply mat 2 which max 1
  • 为什么 false == "false" 是假的?

    我仍在学习 javaScript 的基础知识 我不明白为什么会发生这种情况 有类型强制false false 将转换为 false false true or false false true So why false false 是假的吗
  • JQMIGRATE:jQuery.fn.attr('selected') 可以使用属性而不是属性

    operatordelivery attr checked true 您好 我目前正在将 jQuery 版本迁移到 jQuery 2 1 1 我可以在控制台中看到警告JQMIGRATE jQuery fn attr selected may
  • 使用 Jsoup 提取 Span 标签数据

    我正在尝试使用 Jsoup 提取 html 中的特定内容 下面是示例 html 内容 div class shop section line bmargin10 tmargin10 div class price section fksk
  • Android 无法禁用剪切复制粘贴

    我无法禁用复制粘贴选项 在三星 Galaxy S2 上 如果我单击编辑文本 则会出现一个箭头 单击该箭头时 所有选项都会出现 onCreateContextMenu 尚未被调用 在 onUserInteration 中 我只是使用 setT
  • 如何在 gtk2hs 中的事件处理程序之间传递状态

    我正在尝试制作一个玩具应用程序 只是为了了解如何在 Haskell 中编写事件驱动程序 我想做的是在画布上画一条线 每次按下按键时该线都会向前移动 所以它有点像文本编辑器中的原始光标 我的问题是我无法找出计算用户按键次数的最佳方法 显然我不
  • Git 合并,不包括从一个分支到另一个分支的提交

    在开发过程中 我经常需要提交和推送 中间 提交 即提交代码不可编译或正在更改某些内容等 我不想进行此类提交 但这是轻松继续我的工作所必需的从办公室到家里 有时其他开发人员可以为他们提供开始工作的基础 我以为我已经找到了解决这个问题的方法 我
  • SQL 查询获取给定邮政编码 20 英里半径内的所有邮政编码(地址)

    我的查询仅匹配彼此相同的邮政编码 我需要一个查询 可以返回给定邮政编码 20 英里半径内的所有邮政编码 DECLARE cZip VARCHAR 5 SET cZip 63026 DECLARE dMin DECIMAL 20 32186
  • 如何编写参数化sql查询来防止SQL注入?

    当我尝试搜索带有主题标签的术语时 我最初发现这是一个问题 结果发现它是 SQL 中的注释分隔符 搜索没有返回任何结果 因为它忽略了主题标签后面的 term 所以现在我很难找到转义用户输入的正确方法 在我看来 这既可以解决主题标签问题 也可以
  • 需要对这个反复出现的问题有一些了解,ANR keyDispatchingTimedOut

    我有一个应用程序在一个特定组件中不断出现 ANR 但我无法弄清楚是什么占用了 cpu 时间 最近我遇到了两种 ANR 一种是本机的 另一种是等待的 DALVIK THREADS main prio 5 tid 1 NATIVE group
  • 如何获取 Mesos Agents Framework 执行器内存

    在 Mesos Web UI 内部 我可以在表中查看 Spark 执行器的内存使用情况 Agents gt Framework gt Executors 有一个表列出了我的 Spark 驱动程序的所有执行程序 它们的内存使用情况在列中指示M
  • 如何用Java读取PGM图像?

    我觉得我在这里错过了一些简单的东西 像往常一样 我正在尝试使用 Java 读取 PGM 图像 Matlab 做得很好 在 Matlab 中输出图像像素 例如 一个小的 32x32 图像 给我这样的结果 1 0 11 49 94 118 11
  • 如何在 scala 中生成案例类参数的值

    我有一个包含 250 个字段的案例类 case class Data field1 String field2 Int 有没有办法使用 scala check 为其参数生成值 我看过的不相关问题 如何使用宏为 Scala 案例类中的每个字段
  • ViewModel 中的 Thread.CurrentThread.CurrentUICulture 与 Accept-Language

    全球化 提出这个问题的原因是为了更好地理解如何Thread CurrentThread CurrentUICulture与 ViewModel 和控制器中的属性和错误消息相关的工作 我已经设置了我的项目并覆盖OnActionExecutin
  • 使用 PuTTY 的 tail -f 挂起

    我正在使用 PuTTY 命令行连接到服务器并跟踪日志文件 在本地计算机上 我创建了一个文件 tail exec 其中包含以下文本 tail f var log test log 我通过命令行启动腻子 putty ssh t pw m tai
  • MongoDB:如何进行文本搜索并按日期排序

    上下文 我有一个 MongoDB 里面有大量电子邮件 我想搜索包含以下任意字段中给定电子邮件地址的所有电子邮件 收件人 发件人 抄送 和 密件抄送 结果需要按日期字段排序 我们目前正在尝试以下查询 db collection find te