【问题标题】:Return only the array element on which a text search matched仅返回文本搜索匹配的数组元素
【发布时间】:2016-10-31 08:12:09
【问题描述】:

假设我创建了以下数据库/集合:

use articles

db.stores.insert( [ 
             {_id : 1, arr : ['abc xyz', 'def']}, 
             {_id : 2, arr : ['jadskf', 'ljh abc']}])

db.stores.createIndex({"arr" : "text"})

我想对数组 arr 进行文本搜索,并且只获取与搜索匹配的数组元素。

例如,

> db.stores.find({$text : {$search : "abc"}})
{ "_id" : 1, "arr" : [ "abc xyz", "def" ] }
{ "_id" : 2, "arr" : [ "jadskf", "ljh abc" ] }

理想情况下,我只想获取第一个文档中arr 的第一个元素:abc xyz,并且仅获取第二个文档中arr 的第二个元素:ljh abc,以及@ 987654329@ 的匹配文档。

这可能吗?如果有,怎么做?

请注意,我想要的不是arr 元素的简单投影,而是匹配发生的arr 的元素。

我正在使用 Mongo 3.2.7。

【问题讨论】:

标签: arrays mongodb full-text-search


【解决方案1】:

我的第一个想法是我们可以使用$elemMatch 并且问题解决了,但是......在$elemMatch 上没有文本搜索。

换个角度看,我们可以在这种情况下使用正则表达式,因为第一次昂贵的扫描收集是我的文本搜索索引完成的,那么正则表达式将是一个完美的解决方案。

db.stores.find({
    $text : {
        $search : "abc"
    }
}, {
    arr : {
        $elemMatch : {
            $regex : /abc/i
        }
    }
})

欢迎任何 cmets!

【讨论】:

  • 这确实解决了问题,但不是最优的。除了进行两次搜索(我同意第二次不是对整个数据集进行搜索)之外,文本搜索的语义与简单的正则表达式不同,例如,在文本搜索中使用了停用词、词干等。 Mongo 在内部知道匹配发生的位置,但它似乎并不容易公开。
  • @CassioPereira 同意,但即使是聚合框架也无法解决这个问题,因为 $text 搜索只能在第一个管道阶段使用(问题是我们需要执行两次 :()
猜你喜欢
  • 2017-12-01
  • 1970-01-01
  • 2016-07-13
  • 2013-01-22
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
相关资源
最近更新 更多