文本搜索 - 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,因为默认情况下文档不会根据分数排序。
我在我的应用程序中使用 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,因为默认情况下文档不会根据分数排序。