我在MongoDB中创建了一个文本索引。 索引包含翻译成多种语言的文本。 我希望用户能够搜索所有翻译。
我研究了文档,但由于以下问题而最终从索引中删除了语言信息: 如果我指定文字语言,则MongoDB会将特定于语言的规则应用于可搜索的文字(例如词干)。 如果我随后搜索特定文本,则MongoDB将对搜索文本应用相同的规则,如果语言不匹配,则找不到某些文本。
具体来说,我搜索了“humanité”或“ humanite”文本,并检查了查询计划说明。下面列出了不同的词干。
如您所见,法语中“humanité”的来源为“ human”,而英语(或无语言)的含义为“ humanite”。
如果用户忘记了这些尖锐字符而只输入了“人道主义”字样,那么对于法语和英语,它将被简化为“人道主义”字样,但是如果指定了language = 'none'
则不会。
我想出的唯一替代解决方案是让用户选择他们要搜索的语言,或者使用提供其他功能的专用搜索数据库。
工作:
collection.createIndex(
{ field1: 'text', field2: 'text' },
{ background: true, name: '$text', default_language: 'none',
language_override: '__non_existing_field' })
collection.aggregate([
{ $match: { $text: { $search: filter } } },
{ $addFields: { '_sort.score': { $meta: 'textScore' } } },
{ $sort: { '_sort.score': -1 } }])
不起作用:
collection.createIndex(
{ field1: 'text', field2: 'text' },
{ background: true, name: '$text', default_language: 'en', language_override: '_text_language' })
collection.aggregate([
{ $match: { $text: { $search: filter /* also not working with $language: 'en' or 'none' */ } } },
{ $addFields: { '_sort.score': { $meta: 'textScore' } } },
{ $sort: { '_sort.score': -1 } }])