Многоязычные запросы в ElasticSearch

Допустим, у нас есть следующее сопоставление в ElasticSearch.

{
  "content": {
    "properties": {
      "id": {
        "type": "string",
        "index": "not_analyzed",
        "store": "yes"
      },
      "locale_container": {
        "type": "object",
        "properties": {
          "english": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string",
                "index_analyzer": "english",
                "search_analyzer": "english",
                "index": "analyzed",
                "term_vector": "with_positions_offsets",
                "store": "yes"
              },
              "text": {
                "type": "string",
                "index_analyzer": "english",
                "search_analyzer": "english",
                "index": "analyzed",
                "term_vector": "with_positions_offsets",
                "store": "yes"
              }
            }
          },
          "german": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string",
                "index_analyzer": "german",
                "search_analyzer": "german",
                "index": "analyzed",
                "term_vector": "with_positions_offsets",
                "store": "yes"
              },
              "text": {
                "type": "string",
                "index_analyzer": "german",
                "search_analyzer": "german",
                "index": "analyzed",
                "term_vector": "with_positions_offsets",
                "store": "yes"
              }
            }
          },
          "russian": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string",
                "index_analyzer": "russian",
                "search_analyzer": "russian",
                "index": "analyzed",
                "term_vector": "with_positions_offsets",
                "store": "yes"
              },
              "text": {
                "type": "string",
                "index_analyzer": "russian",
                "search_analyzer": "russian",
                "index": "analyzed",
                "term_vector": "with_positions_offsets",
                "store": "yes"
              }
            }
          },
          "italian": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string",
                "index_analyzer": "italian",
                "search_analyzer": "italian",
                "index": "analyzed",
                "term_vector": "with_positions_offsets",
                "store": "yes"
              },
              "text": {
                "type": "string",
                "index_analyzer": "italian",
                "search_analyzer": "italian",
                "index": "analyzed",
                "term_vector": "with_positions_offsets",
                "store": "yes"
              }
            }
          }
        }
      }
    }
  }
}

Когда конкретный пользователь запрашивает индекс, мы можем взять его культуру из его настроек, т.е. мы знаем, какой анализатор использовать. Как мы можем сформулировать запрос, который будет искать только поля «название» и «текст» на ее родном языке (скажем, немецком) и использовать анализатор немецкого языка для токенизации поискового запроса?


person Primary Key    schedule 13.09.2011    source источник
comment
Это, безусловно, возможно с таким сопоставлением, но не рассматривали ли вы возможность создания отдельных индексов для каждого языка? Это уменьшило бы дублирование в конфигурации и упростило бы добавление новых языков.   -  person Artur Nowak    schedule 13.09.2011
comment
На самом деле, у меня есть. Но для меня это имеет больше смысла, как это. Это очень упрощенное отображение. В реальных документах очень мало полей, зависящих от языка, и много полей, не зависящих от языка.   -  person Primary Key    schedule 13.09.2011


Ответы (1)


Я упростил пример, чтобы использовать анализатор standard для «английского» и simple (без остановки) для «французского». Для такого документа:

{
  id: "abc",
  locale_container: {
    english: {
      title: "abc to ABC",
      text: ""
    },
    french: {
      title: "def to DEF",
      text: ""
    }
  }
}

Следующие запросы помогают:

  • locale_container.english.title:abc -> возвращает документ
  • locale_container.french.title:def -> также возвращает документ
  • locale_container.english.title:to -> ничего не возвращает, так как "to" является стоп-словом
  • locale_container.french.title:to -> возвращает документ
person Artur Nowak    schedule 14.09.2011