问题描述
我正在开发一个功能,该功能可以使用MongoDB Atlas的全文本搜索功能查找按分数排序的相似文档。
我将收藏索引设置为“动态”。
我正在寻找文本字段中的相似之处,例如“名称”或“描述”,但是我还想查看另一个存储“主题”的字段,其中存储了主题的整数值(id)。
示例:
{
name: "test",description: "It's a glorIoUs day!",thematic: [9,3,2,33]
}
我希望我的搜索在主题字段中与这些int
相匹配,并在分数计算中包括它们的权重。
例如,如果我将参考文件与进行比较:
{
name: "test2",description: "It's a glorIoUs night!",6,22]
}
由于主题字段与参考文档共享9
和3
值,因此我想提高分数。
问题:
我应该使用什么search operator来实现这一目标?我可以使用text
运算符输入字符串数组作为查询,但是我不知道如何处理整数。
我应该采用另一种方法吗?像将数组拆分为多个compound.should.term
查询一样?
修改:
Atlas Search无法为数组中的数字或日期值编制索引。
在考虑更改对象的整个数据结构之前,我想确保没有解决方法。
例如,可以用custom analyzers完成吗?
解决方法
我通过在集合中添加触发器来解决了这个问题。每次插入或更新文档时,我都会更新thematic
和其他类似字段,例如_thematic
,我存储整数的字符串值。然后,我使用此_thematic
字段进行搜索。
以下是演示它的示例代码:
exports = function (changeEvent) {
const fullDocument = changeEvent.fullDocument;
const format = (itemSet) => {
let rst = [];
Object.keys(itemSet).forEach(item => rst.push(itemSet[item].toString()));
return rst;
};
let setter = {
_thematic: fullDocument.thematic ? format(fullDocument.thematic) : [],};
const docId = changeEvent.documentKey._id;
const collection = context.services.get("my-cluster").db("dev").collection("projects");
const doc = collection.findOneAndUpdate({ _id: docId },{ $set: setter });
return;
};
我很确定可以用一种更简洁的方式来完成它,因此,如果有人发布它,我会将所选答案切换到她/他的身上。
解决此问题的另一种方法是制作一个带有字符映射的自定义分析器,该分析器会将每个数字替换为对应的字符串。我还没有尝试过参见https://docs.atlas.mongodb.com/reference/atlas-search/analyzers/custom/#mapping
欢迎选择!