Java Spring Mongodb嵌套对象字段上带权重的部分文本搜索

Java Spring Mongodb嵌套对象字段上带权重的部分文本搜索,java,spring,mongodb,Java,Spring,Mongodb,我正在尝试使用Mongo和Spring实现加权部分文本搜索。我的Mongo文档的结构如下: { "_id" : ObjectId("5947d610659f8e614887cbc9"), "_class" : "co.ecg.alpaca.model.SearchIndexEntry", "type" : "GroupAccessDevice", "deviceId" : "Bogus_Device", "devicesName" : "Bogus Dev

我正在尝试使用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查询完成吗?也许是某种聚合?

据我所知,不可能在一个查询中完成。有关为什么不能在mongo查询中使用外部函数(即,计算两个字符串之间的Levenishtein距离的函数)的解释,请参见接受的答案

例如,以下查询将返回所需的文档:

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

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

您将无法在聚合框架中进行Levenshtein距离排序,至少不能使用
kitten->sitten
这种情况,因为排列非常复杂。在这里,您最好将
作为正则表达式进行匹配,然后仅在
$unwind
之后,甚至可以使用查看字符串长度。但是操作员需要MongoDB 3.4。相关:。我就是这么想的。谢谢