2.X/2. Search in Depth

2-3-09. Custom _all Fields

drscg 2017. 9. 28. 21:49

In Metadata: _all Field, we explained that the special _all field indexes the values from all other fields as one big string. Having all fields indexed into one field is not terribly flexible, though. It would be nice to have one custom _all field for the person’s name, and another custom _all field for the address.

Metadata: _all Field에서, 하나의 큰 string으로 다른 모든 field의 값을 색인한 특별한 _all field를 설명한 바 있다. 하나의 field에 색인된 모든 fields를 가지고 있는 것은, 그렇게 융통성 있는 것은 아니다. 하지만, 사람의 이름을 위해 사용자 정의 _all field를, 그리고 주소를 위한 또 다른 사용자 정의 _all field를 가지는 것은 괜찮지 않을까?

Elasticsearch provides us with this functionality via the copy_to parameter in a field mapping:

Elasticsearch는, field mapping에서 copy_to 매개변수를 통해, 이 기능을 제공한다.

PUT /my_index
{
    "mappings": {
        "person": {
            "properties": {
                "first_name": {
                    "type":     "string",
                    "copy_to":  "full_name" 
                },
                "last_name": {
                    "type":     "string",
                    "copy_to":  "full_name" 
                },
                "full_name": {
                    "type":     "string"
                }
            }
        }
    }
}

 

first_name 과 last_name field의 값은 full_name field로 복사된다.

With this mapping in place, we can query the first_name field for first names, the last_name field for last name, or the full_name field for first and last names.

이렇게 mapping하면, first name은 first_name field에서, last name은 last_name field에서, first name과 last name은 full_name field에서 query할 수 있다.

Mappings of the first_name and last_name fields have no bearing on how the full_name field is indexed. The full_name field copies the string values from the other two fields, then indexes them according to the mapping of the full_name field only.

first_name 과 last_name field를 mapping하는 것은 full_name field가 색인되는 방법과는 아무런 관계가 없다. full_name field는 다른 두 field의 문자열 값을 복사하고, full_name field의 mapping에 따라 그것을 색인한다.

Warning

The copy_to setting will not work on a multi-field. If you attempt to configure your mapping this way, Elasticsearch will throw an exception.

copy_to 설정은 multi-field에서 동작하지 않을 것이다. mapping을 이런 방식으로 설정하려 한다면, Elasticsearch는 예외를 발생시킬 것이다.

Why? Multi-fields are simply indexing the "main" field a different way; they don’t have their own source. Which means there is no source to copy_to a different field.

왜? multi-field는 단순히 "주(main)" field를 다른 방식으로 색인하는 것이다. 그것들은 그들 자신의 소스(source)를 가지지 않는다. 이것은 다른 field를 copy_to 하면 소스가 없다는 것을 의미한다.

You can easily copy_to the "main" field to achieve the same effect:

동일한 효과를 위해 "주(main)" field를 쉽게 copy_to 할 수 있다.

PUT /my_index
{
    "mappings": {
        "person": {
            "properties": {
                "first_name": {
                    "type":     "string",
                    "copy_to":  "full_name", 
                    "fields": {
                        "raw": {
                            "type": "string",
                            "index": "not_analyzed"
                        }
                    }
                },
                "full_name": {
                    "type":     "string"
                }
            }
        }
    }
}

copy_to 는 multi-field가 아닌 "주(main)" 에 있다.


'2.X > 2. Search in Depth' 카테고리의 다른 글

2-3-07. Cross-fields Entity Search  (0) 2017.09.30
2-3-08. Field-Centric Queries  (0) 2017.09.28
2-3-10. cross-fields Queries  (0) 2017.09.28
2-3-11. Exact-Value Fields  (0) 2017.09.28
2-4. Proximity Matching  (0) 2017.09.24