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_analyzed
string. 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" } } }
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" }
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 |