【问题标题】:Mongo Text Search Multiple Phrases - AND, ORMongodb 文本搜索多个短语 - AND、OR
【发布时间】:2021-08-18 10:05:57
【问题描述】:

以下返回包含短语“Comp and Comp”和“Low Threat”的所有文档

{ $text: { $search: '"Comp and Comp" "Low Threat"' } }

类似,如何对多个短语进行 OR 文本搜索?

我能得到的最近的是:

{ $text: { $search: 'Comp and Comp Low Threat' } }

但它没有办法对短语进行分组,它只对单个字符串执行 OR。

【问题讨论】:

    标签: mongodb mongodb-query spring-data-mongodb


    【解决方案1】:

    您似乎无法使用来自docs 的短语来执行此操作:

    如果 $search 字符串包含一个短语和单个术语,文本搜索将只匹配包含该短语的文档。

    所以基本上这要求任何标记为短语(带有")的字符串都必须出现在strong中。

    你能做的最好的就是运行一个带有 $facet 和 2 个匹配条件的聚合管道,然后分组以消除重复项,如下所示:

    db.collection.aggregate([
        {
            $facet: {
                comp: {
                    $match: { $text: { $search: '\"Comp and Comp\"' } }
                },
                low: {
                    $match: { $text: { $search: '\"Low Threat\"' } }
                }
            }
        },
        {
            $project: {
                merged: {$concatArray: ["$comp", "$low"]}
            }
        },
        {
            $unwind: "$merged"
        },
        {
            $group: {
                _id: "$merged._id",
                root: {$first: "$$ROOT"}
            }
        },
        {
            $replaceRoot: {
                newRoot: "$root"
            }
        },
    ])
    

    【讨论】:

    • 不起作用。看起来只有一个$text 可以出现在$or 中。 $text 运算符只能在舞台中出现一次。我收到“文本表达式过多”错误
    • 没错,文档中的第一个限制字面意思是:“一个查询最多可以指定一个 $text 表达式”。我编辑了我的答案以反映这一点。
    猜你喜欢
    • 2015-08-28
    • 2013-10-14
    • 2015-09-18
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多