1

我在我的应用程序中使用 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"},
  ]
)

问题

所以如果我搜索“代理生产”

结果应该是

[
  { _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" }

任何建议将不胜感激。

4

1 回答 1

2

让我们回顾一下$text查询中的 $search 字符串是如何工作的。如果给出了一个短语,如在 中"$search": "\"agent production\"",则只有索引字段与该短语匹配的文档才会收到非零分数。这就解释了为什么在这种情况下没有发现任何结果。但是,指定"$search": "\"production agent\""会将文档与_id: 3. 如果给出了单个单词/术语,如在 中"$search": "\"agent\" \"production\"",具有与任何术语匹配的索引字段的任何文档都会获得分数。这解释了为什么返回文档 with _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 是因为默认情况下文档不是基于分数排序的。

于 2016-02-18T06:08:30.523 回答