Elasticsearch의 Nested Object

6927 단어 elasticsearch
(이것은 작은 시리즈입니다. 스탬프: Elasticsearch의 Nested (끼워넣기) 시리즈, 다른nested 관련 글 보기)
   Given the fact that creating, deleting, and updating a single document in Elasticsearch is atomic, 
it makes sense to store closely related entities within the same document.
ES에서 단일 텍스트를 삭제하고 업데이트하는 것이 원자적이라는 것을 감안하면 관련 실체를 같은 텍스트에 저장하는 것은 의미가 있다.
PUT /my_index/blogpost/1
{
  "title":"Nest eggs",
  "body":  "Making your money work...",
  "tags":  [ "cash", "shares" ],
  "comments":[
     {
	  "name":    "John Smith",
      "comment": "Great article",
      "age":     28,
      "stars":   4,
      "date":    "2014-09-01"
	 },
	 {
      "name":    "Alice White",
      "comment": "More like this please",
      "age":     31,
      "stars":   5,
      "date":    "2014-10-22"
     }
  ]
}

Because all of the content is in the same document, there is no need to join blog posts and comments at query time, so searches perform well. 
모든 내용이 같은 텍스트에 있기 때문에 검색할 때 블로그posts를 연결할 필요가 없기 때문에 검색 성능이 더욱 좋습니다.
The problem is that the preceding document would match a query like this: 
문제는 위의 문서가 이러한 질의와 일치한다는 것입니다.
curl -XPGET 'localhost:9200/_search' -d '
{
  "query":{
     "bool":{
   "must":[
     {"match":{"name":"Alice"}},
     {"match":{"age":28}}
   ]
 }
  }
}'
 Alice is 31, 28 !

The reason for this cross-object matching, as discussed in Arrays of Inner Objects, is that our beautifully structured JSON document is flattened into a simple key-value format in the index that looks like this:
이러한 교차 객체가 일치하는 이유는 구조적인 JSON 문서가 색인 내의 간단한 키 값 형식으로 플랫화되기 때문입니다.
{
  "title":              [ eggs, nest ],
  "body":             [ making, money, work, your ],
  "tags":              [ cash, shares ],
  "comments.name":    [ alice, john, smith, white ],
  "comments.comment":  [ article, great, like, more, please, this ],
  "comments.age":      [ 28, 31 ],
  "comments.stars":     [ 4, 5 ],
  "comments.date":      [ 2014-09-01, 2014-10-22 ]
}

The correlation between Alice and 31, or between John and 2014-09-01, has been irretrievably lost. 
분명히 이런'Alice'/'31','john'/'2014-09-01'간의 관련성은 피할 수 없이 잃어버렸다.
While fields of type object (see Multilevel Objects) are useful for storing a single object, they are useless, from a search point of view, 
for storing an array of objects.
Object 형식의 필드는 단일한object를 저장하는 데 유용하지만, 검색의 측면에서 볼 때, 이것은 Object 그룹을 저장하는 데 쓸모가 없습니다.
This is the problem that nested objects are designed to solve.
nestedobject는 상술한 문제를 해결하기 위해 설계된 것이다.
By mapping the commments field as type nested instead of type object, each nested object is indexed as a hidden separate document, something like this:
comments 필드를object 형식이 아닌nested 형식으로 비추면 모든 nestedobject는 숨겨진 단독 텍스트로 인덱스됩니다.다음과 같습니다.
{ ①
  "comments.name":    [ john, smith ],
  "comments.comment": [ article, great ],
  "comments.age":     [ 28 ],
  "comments.stars":   [ 4 ],
  "comments.date":    [ 2014-09-01 ]
}
{ 
  "comments.name":    [ alice, white ],
  "comments.comment": [ like, more, please, this ],
  "comments.age":     [ 31 ],
  "comments.stars":   [ 5 ],
  "comments.date":    [ 2014-10-22 ]
}
{ 
  "title":            [ eggs, nest ],
  "body":             [ making, money, work, your ],
  "tags":             [ cash, shares ]
}
①nested object

By indexing each nested object separately, the fields within the object maintain their relationships. We can run queries that will match only 
if the match occurs within the same nested object.
모든nestedobject에 색인을 만들면object 내부의 필드 간의 관계를 유지할 수 있습니다.검색을 실행할 때 "match"와 같은 nested object 결과만 일치합니다.
Not only that, because of the way that nested objects are indexed, joining the nested documents to the root document at query time is fast—almost as fast as if they were a single document.
뿐만 아니라nestedobjects가 색인을 만드는 방식 때문에 조회할 때 루트 텍스트와nested 문서를 연결하는 것은 매우 빠르다. 그들을 단독 텍스트로 간주하는 것과 마찬가지로 빠르다.
These extra nested documents are hidden; we can’t access them directly. To update, add, or remove a nested object, we have to reindex 
the whole document. It’s important to note that, the result returned by a search request is not the nested object alone; it is the whole document.
이 추가nested 텍스트는 숨겨져 있습니다.우리는 직접 접촉할 수 없다.업데이트를 위해nested 대상을 추가하거나 제거하려면 전체 텍스트를 다시 삽입해야 합니다.한 가지 기억해야 한다. 검색 요청이 되돌아오는 결과는nested 대상이 아니라 전체 텍스트를 포함한다.
You may want to index inner objects both as nested fields and as flattened object fields, eg for highlighting. This can be achieved
 by setting include_in_parent to true:
내부object를 검색할 때 nested 필드와 정평한object 필드를 동시에 사용하려고 할 수도 있습니다. 예를 들어 강조하기 위해서입니다.이것을 통해 include_in_parent 설정은true 구현:
curl -XPUT 'localhost:9200/my_index' -d '
{
  "mappings":{
     "blogpost":{
	     "properties":{
		     "comments":{
			    "type":"nested",
				"include_in_parent":true,
				"properties":{
				   "name":    {"type":"string"    },
				   "comment": { "type": "string"  },
                   "age":     { "type": "short"   },
                   "stars":   { "type": "short"   },
                   "date":    { "type": "date"    }
				}
			 }
		 }
	 }
  }
}

The result of indexing our example document would be something like this:
질의 결과는 다음과 같습니다.
{ 
    "user.first" : "alice",
    "user.last" :  "white"
}
{ 
    "user.first" : "john",
    "user.last" :  "smith"
}
{ 
    "group" :        "fans",
    "user.first" : [ "alice", "john" ],
    "user.last" :  [ "smith", "white" ]
}

Nested fields may contain other nested fields. The include_in_parent object refers to the direct parent of the field, while the include_in_root 
parameter refers only to the topmost “root” object or document.
nested 필드는 다른 nested 필드를 포함할 수 있습니다.include_in_parent object 관련 필드의 직접 상단, include_in_루트는 "루트"obejct나 텍스트만 연결합니다.
참조:
일.http://www.elastic.co/guide/en/elasticsearch/guide/master/nested-objects.html
이.http://www.elastic.co/guide/en/elasticsearch/reference/1.4/mapping-nested-type.html

좋은 웹페이지 즐겨찾기