文本搜索 - mongodb

Text search - mongodb

我在我的应用程序中使用 mongo 文本搜索。

索引:

db.test.createIndex(
    {
        title: 'text',
        description: 'text'
    },
    {
        name: "TextIndex",
        weights: {
           title: 10,
           description: 1
        }
    }
)

得分:

title : 10
description : 1

文件:

db.test.insert(
  [
    { _id: 1, title: "agent de production", description: "production or agent"},
    { _id: 2, title: "agent test production", description: "agent" },
    { _id: 3, title: "production agent", "description" : "production"},
    { _id: 4, title: "agent", "description" : "production"},
    { _id: 5, title: "test", "description" : "production example agent"},
  ]
)

问题

所以如果我搜索 "agent production"

结果应该是

[
  { _id: 1, title: "agent de production", description: "production or agent"},
  { _id: 2, title: "agent test production", description: "agent" },
  { _id: 3, title: "production agent", "description" : "production"},
  { _id: 5, title: "test", "description" : "production example agent"},
]

我尝试过的:

db.test.find({"$text" : {"$search" : "\"agent production\""}}); Query result does not match with the expected result.

结果:无

查询短语 : db.test.find({"$text" : {"$search" : "\"agent\" \"production\"" }})

结果 :

{ "_id" : 5, "title" : "test", "description" : "production example agent" }
{ "_id" : 1, "title" : "agent de production", "description" : "production or agent" }
{ "_id" : 3, "title" : "production agent", "description" : "production" }
{ "_id" : 2, "title" : "agent test production", "description" : "agent" }
{ "_id" : 4, "title" : "agent", "description" : "production" }

任何建议将不胜感激。

让我们回顾一下 $text 查询中的 $search 字符串是如何工作的。如果给出了一个短语,如 "$search": "\"agent production\"",只有索引字段与该短语匹配的文档才会获得非零分数。这就解释了为什么在这种情况下没有找到结果。但是,指定 "$search": "\"production agent\"" 会将文档与 _id: 3 匹配。如果给出了单个 words/terms,如 "$search": "\"agent\" \"production\"",任何具有与任何术语匹配的索引字段的文档都会获得一个分数。这解释了为什么返回带有 _id: 4 的文档,因为它具有单独的术语,不一定是单个字段中的两个术语,如您在所需结果中所示。

要强制将两个搜索词都包含在一个字段中,您需要向查询添加额外的子句。您可以执行文本搜索以对文档进行评分,并使用正则表达式进一步过滤它们,如:

db.test.find( { $and: [ { "$text": { "$search": "\"agent\" \"production\"" } },
    { $or: [
        { $and: [ { title: /agent/i }, { title: /production/i } ] }, 
        { $and: [ { description: /agent/i }, { description: /production/i } ] }
    ] }
 ] }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } )

请注意,添加了 textScore,因为默认情况下文档不会根据分数排序。