2.X/1. Getting Started

1-08-2. String Sorting and Multifields

drscg 2017. 9. 30. 18:13

Analyzed string fields are also multivalue fields, but sorting on them seldom gives you the results you want. If you analyze a string like fine old art, it results in three terms. We probably want to sort alphabetically on the first term, then the second term, and so forth, but Elasticsearch doesn’t have this information at its disposal at sort time.

analyzed string field 또한 다중 값 field이다. 그러나 그것들을 정렬해 보면, 거의 원하는 결과가 나오지 않는다. fine old art 같은 문자열을 분석해 보면, 3개의 단어가 나온다. 아마도 ABC순으로 첫 번째 단어로, 그 다음에 두 번째 단어로 정렬되기를 기대할 것이다. 그러나, Elasticsearch는 정렬 시에, 이런 처리에 대한 정보를 가지고 있지 않다.

You could use the min and max sort modes (it uses min by default), but that will result in sorting on either art or old, neither of which was the intent.

min(기본 mode) 또는 max sort mode를 사용할 수 있으나, 의도했던 것이 아닌, art 나 old 로 정렬될 것이다.

In order to sort on a string field, that field should contain one term only: the whole not_analyzedstring. But of course we still need the field to be analyzed in order to be able to query it as full text.

string field를 정렬하기 위해서는, 해당 field가, 전체가 not_analyzed string인, 단 하나의 단어만을 포함하고 있어야 한다. 그러나, full-text로 query할 수 있도록 하기 위해서, field는 분석되어야 한다.

The naive approach to indexing the same string in two ways would be to include two separate fields in the document: one that is analyzed for searching, and one that is not_analyzed for sorting.

두 가지 방식으로 동일한 string을 색인하는, 단순한 접근은, document에 두 개의 분리된 field(검색을 위한 analyzed field, 정렬을 위한 not_analyzed field)를 포함하는 것이다.

But storing the same string twice in the _source field is waste of space. What we really want to do is to pass in a single field but to index it in two different ways. All of the core field types (strings, numbers, Booleans, dates) accept a fields parameter that allows you to transform a simple mapping into a multifield mapping like this:

그러나, 동일한 string을 _source field에 두 번 저장하는 것은 디스크 낭비이다. 가장 좋은 방법은 단일 field 에, 2가지 다른 방법으로 색인 하는 것이다. 모든 기본 field type(string, number, boolean, date)은 fields 매개변수를 통해, 단순한 mapping을 multifield mapping으로 변경할 수 있다.

"tweet": {
    "type":     "string",
    "analyzer": "english"
}

into a multifield mapping like this:

"tweet": { 
    "type":     "string",
    "analyzer": "english",
    "fields": {
        "raw": { 
            "type":  "string",
            "index": "not_analyzed"
        }
    }
}

tweet field는 전과 마찬가지로, analyzed full-text field이다.

tweet.raw 라는 새로운 하위 field는 not_analyzed 이다.

Now, or at least as soon as we have reindexed our data, we can use the tweet field for search and the tweet.raw field for sorting:

이제, 데이터를 다시 색인하면, 검색에는 tweet field를, 정렬에는 tweet.raw field를 사용할 수 있다.

GET /_search
{
    "query": {
        "match": {
            "tweet": "elasticsearch"
        }
    },
    "sort": "tweet.raw"
}
Warning

Sorting on a full-text analyzed field can use a lot of memory. See Aggregations and Analysis for more information.

full-text analyzed field를 정렬하는 것은 많은 메모리를 사용할 수 있다. Aggregations and Analysis를 참조하자.


'2.X > 1. Getting Started' 카테고리의 다른 글

1-08. Sorting and Relevance  (0) 2017.09.30
1-08-1. Sorting  (0) 2017.09.30
1-08-3. What Is Relevance?  (0) 2017.09.30
1-08-4. Doc Values Intro  (0) 2017.09.30
1-09. Distributed Search Execution  (0) 2017.09.30