如何使用复合MongoDB Atlas搜索查询来搜索整数数组?

问题描述

我正在开发一个功能,该功能可以使用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]
}

由于主题字段与参考文档共享93值,因此我想提高分数。


问题:

我应该使用什么search operator来实现这一目标?我可以使用text运算符输入字符串数组作为查询,但是我不知道如何处理整数。

我应该采用另一种方法吗?像将数组拆分为多个compound.should.term查询一样?


修改

经过大量搜索,我发现了这个herehere

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

欢迎选择!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...