Spring Mongodb部分文本搜索,在嵌套对象字段上使用权重

时间:2017-06-19 21:04:07

标签: java spring mongodb

我正在尝试使用Mongo和Spring实现加权的部分文本搜索。我的Mongo文档结构如下:

{
    "_id" : ObjectId("5947d610659f8e614887cbc9"),
    "_class" : "co.ecg.alpaca.model.SearchIndexEntry",
    "type" : "GroupAccessDevice",
    "deviceId" : "Bogus_Device",
    "devicesName" : "Bogus Device",
    "properties" : {
        "deviceType" : "Polycom VVX 500",
        "netAddress" : "",
        "macAddress" : "000111222111",
        "serviceProviderId" : "Bogus",
        "availablePorts" : "12",
        "groupId" : "Bogus_Group",
        "version" : ""
    },
    "tags" : [
        {
            "tag" : "Bogus_Device",
            "score" : 10
        },
        {
            "tag" : "Bogus Device",
            "score" : 9
        },
        {
            "tag" : "000111222111",
            "score" : 7
        },
        {
            "tag" : "Bogus_Group",
            "score" : 3
        },
        {
            "tag" : "Bogus",
            "score" : 3
        }
    ],
    "createdBy" : "ALPACA_SYSTEM",
    "createdDate" : ISODate("2017-06-19T13:48:00.473Z"),
    "lastModifiedBy" : "ALPACA_SYSTEM",
    "lastModifiedDate" : ISODate("2017-06-19T13:48:00.473Z"),
    "cluster" : DBRef("broadworks_cluster", ObjectId("5947d60a659f8e614887cb1a")),
    "parent" : DBRef("search_index", ObjectId("5947d610659f8e614887cbb7"))
}

我想要做的是对tag.name使用部分正则表达式搜索,然后通过tag.score乘以正则表达式和tag.name之间的Levenshtein距离对它们进行排序。我的问题是,这可能与一个Mongo查询有关,可能是某种聚合吗?

1 个答案:

答案 0 :(得分:0)

据我所知,在一次查询中无法执行此操作。请参阅接受的答案here,了解为什么您不能在mongo查询中使用外部函数(即计算两个字符串之间的Leveninshtein距离的函数)。

以下查询例如将返回您想要的文档:

db.getCollection('test').aggregate([{$match: {tags: {$elemMatch: {tag: {$regex: 'Bogus'}}}}}])

然后,您需要在内存中自己对标记数组进行排序。