我有一个基于多个字段的全文索引,目前所有字段的默认权重均为1。 现在我想从全文索引搜索特定字段。所以我在考虑给不同的字段赋予不同的权重,并以某种方式将分数映射到字段,以便我可以根据分数进行过滤,从而基本上过滤多个文件中的特定字段。但是看看分数计算是如何完成的(https://github.com/mongodb/mongo/blob/master/src/mongo/db/fts/fts_spec.cpp),看起来并不是那么直截了当地得到得分和字段的映射,或者可能是不可能的。
db.collection.createIndex({
Name: "text",
Line: "text",
City: "text",
State: "text",
Zip: "text",
}, {
weights: {
Name: 16,
Line:8,
City: 4,
State: 2,
Zip: 1,
},
name: "TextIndex"
})
过去有没有人做过类似的事情可以提供一些指示?
答案 0 :(得分:1)
Mongodb对全文搜索的支持有限。最重要的限制记录在https://docs.mongodb.com/manual/core/index-text/#restrictions。
由于您的字符串长度有限,您可以估算最低分数并使用权重和按分数范围过滤,例如:
db.collection.createIndex({
Name: "text",
Line: "text",
City: "text",
State: "text",
Zip: "text",
}, {
weights: {
Name: 10000,
Line:1000,
City: 100,
State: 10,
Zip: 1,
},
name: "TextIndex"
})
并仅在Line
和State
中搜索:
db.collection.aggregate([
{$match: {$text:{$search: serach_string}}},
{$addFields: { score: { $meta: "textScore" } } },
{$match: {$or:[
// 1.01 - is the minimal score for State, higher than weight of Zip
{score:{$gte: 1.01, $lte: 10}},
// 100.01 - is the minimal score for Line, higher than total weight of Zip, State, and City
// 1010 - is the summary weight of State and Line
{score:{$gte: 100.01, $lte: 1010}}
]}}
])
对于任意长度的字符串,您可以拥有的最好的是文本搜索和正则表达式的组合:
db.collection.find({$and:[
{$text:{$search: serach_string}},
{$or:[{State:/regex/i}, {Line:/regex/i}]}
]})
您需要对serach_string
进行标记并获得构建正则表达式的主干。在一般情况下,由于正则表达式对整理没有任何了解,因此它不会为仅为2个字段构建的索引提供与文本搜索相同的结果。
最后,您可以在隐藏的辅助节点上拥有多个文本索引。它将为您提供最佳结果,但需要副本集中的其他成员。参见例如Different indexes on different replica set members了解详情。