Я создал текстовый индекс в MongoDB.Указатель содержит текст, переведенный на несколько языков.Я хотел бы, чтобы пользователь мог выполнять поиск по всем переводам.
Я изучил документы, но в итоге удалил информацию о языке из индекса из-за следующей проблемы: Если я укажу текстовый язык, MongoDB будет применятьсяспецифичные для языка правила для поиска текста (например, stemming).Если я затем выполню поиск определенного текста, MongoDB будет применять те же правила к тексту поиска, и если языки не совпадают, определенные тексты не будут найдены.
В частности, я искал текст «humanité»или «гуманист» и проверил объяснение плана запроса.Ниже перечислены различные слова на основе.
- 'humanité' (язык: fr)> 'human'
- 'humanite' (язык: fr)> 'humanit'
- «Humanité» (язык: en)> «Humanite»
- «Humanite» (язык: en)> «Humanit»
- «Humanité» (язык: нет)> «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 } }])