Java Spring Mongodb嵌套对象字段上带权重的部分文本搜索
我正在尝试使用Mongo和Spring实现加权部分文本搜索。我的Mongo文档的结构如下: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
{
"_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。相关:。我就是这么想的。谢谢