Настройка многоязычного эластичного поискового сопоставления

У меня есть документы, хранящиеся в MongoDB, например:

const demoArticle = {
  created: new Date(),
  title: [{
    language: 'english',
    value: 'This is the english title'
  }, {
    language: 'dutch',
    value: 'Dit is de nederlandse titel'
  }]
}

Я хочу добавить анализаторы для определенных языков, которые обычно указываются так:

"mappings": {
   "article": {
      "properties": {
         "created": {
            "type": "date"
         },
         "title.value": {
           "type": "text",
           "analyzer": "english"
         }
      }
   }
}

Проблема, однако, в том, что в зависимости от языка, установленного на дочернем уровне, он должен иметь анализатор, настроенный в соответствии с этим же языком.

Я наткнулся на динамические шаблоны в ElasticSearch, но не был уверен, что они подходят для этого варианта использования.

Какие-либо предложения?


person randomKek    schedule 25.07.2018    source источник
comment
В зависимости от количества языков, которые вам необходимо поддерживать, у вас может быть одно подполе для каждого языка, т. е. title_en.value, title_du.value и т. д., каждое из которых имеет собственный анализатор языка.   -  person Val    schedule 30.07.2018
comment
Честно говоря, я не понимаю вопроса. Вы предлагаете вторую награду, но, на мой взгляд, вы должны предоставить более подробную информацию. @Val предложил вам идею выше. Вы хотите объяснить, почему это сработает или не сработает? Просто раздача награды не даст вам волшебным образом идеальное решение. Отвечайте на вопросы и объясняйте дальше. Как и сейчас, это плохо детализированный вопрос, и полученные им голоса незаслуженны.   -  person Andrei Stefan    schedule 07.08.2018
comment
Я согласен с @AndreiStefan. Следуя рекомендациям, либо используйте предложение Вэла, либо создайте один индекс для каждого языка, а затем вы сможете выполнять поиск по индексам. Вы требуете, чтобы все языки были в одном поле, например, в названии? Вы можете взломать его, написав собственный анализатор для создания инвертированного индекса на основе некоторого разделителя между языками.   -  person Polynomial Proton    schedule 08.08.2018
comment
@randomKek какой-нибудь вклад?   -  person Val    schedule 10.08.2018
comment
@randomKek Да, имеет смысл, спасибо всем за участие.   -  person randomKek    schedule 10.08.2018


Ответы (1)


Если вы сопоставите свойство language объекта MongoDB с точным именем анализаторов языка ES, все, что вам нужно, чем в соответствии с рекомендуется Elastic way, вы просто добавили бы:

{
  "mappings": {
    "article": {
      "properties": {
        "created": {
          "type": "date"
        },
        "title": {
          "type": "text",
          "fields": {
            "english": {
              "type": "text",
              "analyzer": "english"
            },
            "dutch": {
              "type": "text",
              "analyzer": "dutch"
            },
            "bulgarian": {
              "type": "text",
              "analyzer": "bulgarian"
            }
          }
        }
      }
    }
  }

Таким образом, у вас есть хорошее совпадение в поле language/analyzer между MongoDB и ES.

person Akrion    schedule 03.08.2018
comment
Не уверен, что это работает таким образом, поскольку вы не можете индексировать разные данные в подполях, то есть вы не можете индексировать английский текст в title.english и голландский текст в title.dutch. Вы просто индексируете одну строку в title, а затем каждое подполе анализируется по-разному, но, вероятно, это не то, чего хочет ОП. - person Val; 03.08.2018
comment
Проблема в том, что у нас уже есть такая настройка рабочей базы данных, поэтому мы не можем изменить схему нашей базы данных. Так что этот ответ не помогает, хотя я ценю ответ - person randomKek; 07.08.2018