2.X/3. Dealing with Human Language

3-1-5. One Language per Field

drscg 2017. 9. 24. 17:44

For documents that represent entities like products, movies, or legal notices, it is common for the same text to be translated into several languages. Although each translation could be represented in a single document in an index per language, another reasonable approach is to keep all translations in the same document:

상품, 영화, 법적 고지같은 요소를 나타내는 document의 경우, 동일한 문장(text)을 여러 가지 언어로 번역하는 것이 일반적이다. 각각의 번역된 문장은 언어별 index에 하나의 document로 표현될 수도 있지만, 또 다른 합리적인 방법은 동일한 document에 모든 번역 문장을 가지는 것이다.

{
   "title":     "Fight club",
   "title_br":  "Clube de Luta",
   "title_cz":  "Klub rváčů",
   "title_en":  "Fight club",
   "title_es":  "El club de la lucha",
   ...
}

Each translation is stored in a separate field, which is analyzed according to the language it contains:

각 번역 문장은 개별 field에 저장되고, 각각이 가진 언어에 따라 분석된다.

PUT /movies
{
  "mappings": {
    "movie": {
      "properties": {
        "title": { 
          "type":       "string"
        },
        "title_br": { 
            "type":     "string",
            "analyzer": "brazilian"
        },
        "title_cz": { 
            "type":     "string",
            "analyzer": "czech"
        },
        "title_en": { 
            "type":     "string",
            "analyzer": "english"
        },
        "title_es": { 
            "type":     "string",
            "analyzer": "spanish"
        }
      }
    }
  }
}

title field는 원래의 제목을 가지고 있고, standard analyzer를 사용한다.

   

다른 field 각각은, 해당 언어에 대해, 적절한 analyzer를 사용한다.

Like the index-per-language approach, the field-per-language approach maintains clean term frequencies. It is not quite as flexible as having separate indices. Although it is easy to add a new field by using the update-mapping API, those new fields may require new custom analyzers, which can only be set up at index creation time. As a workaround, you can close the index, add the new analyzers with the update-settings API, then reopen the index, but closing the index means that it will require some downtime.

언어별 index(index-per-language) 방식과 마찬가지로, 언어별 field((field-per- language) 방식은 명확한 TF를 가진다. 개별 indices를 가지는 것만큼 유연하지는 않다. update-mapping API를 사용해서, 새로운 field를 추가하는 것이 쉬운 반면에, 해당하는 새로운 field는 index 생성 시에만 설정할 수 있는, 새로운 사용자 정의 analyzer가 필요하다. 해결 방법으로는, index를 닫고(close)update-settings API를 이용해, 새로운 analyzer를 추가하고, index를 다시 열어야 한다. 그러나, index를 닫는다는 것은, 정지시간이 필요하다는 의미이다.

The documents of a single language can be queried independently, or queries can target multiple languages by querying multiple fields. We can even specify a preference for particular languages by boosting that field:

하나의 언어로 이루어진 document는 개별적으로 검색된다. 또는 여러 field를 검색함으로써, query는 다중 언어를 목표로 할 수 있다. 심지어, 해당 field에 가장치를 부여하여, 특정 언어에 대한 선호도를 지정할 수 있다.

GET /movies/movie/_search
{
    "query": {
        "multi_match": {
            "query":    "club de la lucha",
            "fields": [ "title*", "title_es^2" ], 
            "type":     "most_fields"
        }
    }
}

이 검색은 title 로 시작되는 모든 field를 query한다. 그러나, title_es field에 2 라는 가중치를 부여한다. 다른 모든 field는 기본 가중치 1 을 가진다.


'2.X > 3. Dealing with Human Language' 카테고리의 다른 글

3-1-3. Pitfalls of Mixing Languages  (0) 2017.09.24
3-1-4. One Language per Document  (0) 2017.09.24
3-1-6. Mixed-Language Fields  (0) 2017.09.24
3-2. Identifying Words  (0) 2017.09.24
3-2-1. standard Analyzer  (0) 2017.09.24