我正在尝试使用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查询有关,可能是某种聚合吗?
答案 0 :(得分:0)
据我所知,在一次查询中无法执行此操作。请参阅接受的答案here,了解为什么您不能在mongo查询中使用外部函数(即计算两个字符串之间的Leveninshtein距离的函数)。
以下查询例如将返回您想要的文档:
db.getCollection('test').aggregate([{$match: {tags: {$elemMatch: {tag: {$regex: 'Bogus'}}}}}])
然后,您需要在内存中自己对标记数组进行排序。