有没有办法将分数与全文索引中的特定字段相关联

时间:2018-03-15 16:26:30

标签: mongodb full-text-search

我有一个基于多个字段的全文索引,目前所有字段的默认权重均为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"
   })

过去有没有人做过类似的事情可以提供一些指示?

1 个答案:

答案 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"
})

并仅在LineState中搜索:

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了解详情。