MongoDB текстовый индекс на нескольких языках - PullRequest
0 голосов
/ 16 июня 2019

Я создал текстовый индекс в 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 } }])
...