在Node和mongodb中搜索带有非重音单词的数据以查找重音单词



我在一个翻译MERN堆栈应用程序上工作,我在数据库中有一个单词föderev,用户只能通过使用这个重音字母来搜索这个单词,但我希望用户可以简单地键入一个foderiv,然后它可以匹配这个föDerev单词,我希望一些非重音单词可以匹配重音单词。我有一些解决方案,但我不知道该怎么办:

https://www.mongodb.com/docs/atlas/atlas-search/analyzers/token-filters/#std-标签asciiFolding tf ref

但是我需要把这个代码放在哪里,这是一些设置还是什么?我真的不知道如何使用这些代币。如果您有任何其他解决方案,请帮助

{
"analyzer": "asciiConverter",
"searchAnalyzer": "asciiConverter",
"mappings": {
"dynamic": true
},
"analyzers": [
{
"name": "asciiConverter",
"tokenizer": {
"type": "standard"
},
"tokenFilters": [
{
"type": "asciiFolding"
}
]
}
]
} 

这就是我如何使用nodeJs 获得搜索查询

exports.search = async (req, res) => {
try {
const query = [
{
$match: {},
},
{
$project: {},
},
{
$limit: 10,
},
];
const projection = {
'bosnian.value': 1,
'german.value': 1,
'english.value': 1,
};
var reqProjections = {};
req.query.projections
? (reqProjections = JSON.parse(req.query.projections))
: null;
query[0].$match[
`${req.query.category || 'word'}.${req.query.lan || 'bosnian'}.value`
] = {
$regex: req.query.word || '',
$options: 'i',
};
req.query.limit ? (query[2].$limit = parseInt(req.query.limit)) : null;
reqProjections.length
? reqProjections.map(
(proj) => (query[1].$project[`${proj}`] = projection)
)
: (query[1].$project[`${req.query.category || 'word'}`] = projection);
const data = await aggregate(model, query);
responseHandler(data, res);
} catch (err) {
console.log(err);
errorHandler(500, res, err.message);
}
}

这涉及到排序规则的大主题,解决方案的细节将取决于您如何准确查询数据库。

但例如,如果您有一个包含字段str: "föderativ"的文档,则此查询将使用弱德语排序规则选项返回该字段

db.collection.find(
{ str: 'foderativ' }
null,
{ collation: { locale: 'de', strength: 1 }  }
)

为了使此查询能够在str上使用索引,还应该使用相同的自定义排序规则来构建索引。

如果你在进行全文搜索,我认为它应该忽略元音变音符,而不需要任何额外的配置,但如果没有,你也可以使用自定义排序规则创建全文索引。

最新更新