2012-08-12 4 views
3

현재 탄성 검색 사용에 문제가 있습니다. 검색을 수행하고 필드의 하위 집합 만 반환하려는 경우 필드가 중첩되어 있으면 점 표기법을 사용하여 필드를 지정해야합니다. 여기 내 CouchDB를 문서에 매핑 내 매퍼 JSON 문서의 샘플입니다 :탄성 검색 출력 필드 이름 바꾸기

{ 
    "product": { 
     "_type": {"store": "yes"}, 
     "_source": {"compress": true}, 
     "index_analyzer": "standard", 
     "search_analyzer": "standard", 
     "dynamic_date_formats": ["date_time_no_millis", "date_optional_time"], 
     "properties": { 
       "_id": {"type": "string", "store": "yes", "index": "not_analyzed"}, 
      "key": {"type": "string", "store": "yes"}, 
      "content": { 
       "type": "object", 
       "path": "just_name", 
       "properties": { 
        "key": {"type": "string", "store": "yes"}, 
        "name": {"type": "string", "store": "yes", "index_name": "name"}, 
        "description": {"type": "string", "store": "yes", "index_name": "description"}, 
        "brand": { 
         "type": "object", 
         "index_name": "brand", 
         "properties": { 
          "abbreviation": {"type": "string", "store": "yes", "index_name": "brand_abbreviation"}, 
          "name": {"type": "string", "store": "yes", "index_name": "brand_name"} 
         } 
        } 
           } 
         } 
       } 
      } 
} 

이 _id를 참조하면 단순한 _id 수 있지만 나는 내용에서 이름을 참조하고 싶었 말할 것입니다, 나는 그것을 참조 할 것 content.name으로. 이 문제는 검색 출력이 꺼져있을 때 json 출력에 "content.name"과 같은 필드 이름이 포함되어 있다는 것입니다.

"이름"으로 이름을 바꾸거나 "내용"을 사용할 수 있습니까? 접두사? 당신은 볼 수 있습니다, 나는 index_name을 지정하려고했지만 쓸데없는 것 같았다.

답변

4

partial_fields을 사용하면이 작업을 수행 할 수 있습니다. 예를 들어

,이 같은 당신 색인 문서는 경우 :

curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1' -d ' 
{ 
    "partial_fields" : { 
     "doc" : { 
     "include" : [ 
      "name", 
      "foo.*" 
     ] 
     } 
    } 
} 
' 

당신에게이 같은 결과를 줄 것이다 :

curl -XPUT 'http://127.0.0.1:9200/test/test/1?pretty=1' -d ' 
{ 
    "email" : "[email protected]", 
    "name" : "john", 
    "foo" : { 
     "bar" : { 
     "baz" : 1 
     } 
    } 
} 
' 

당신은 당신이 이렇게 원하는 필드/객체를 포함 할 수 있습니다 : (누락 된 email 필드에 주목하고 해당 필드 foo은 해시로 유지됩니다.) -

{ 
    "hits" : { 
     "hits" : [ 
     { 
      "_score" : 1, 
      "fields" : { 
       "doc" : { 
        "name" : "john", 
        "foo" : { 
        "bar" : { 
         "baz" : 1 
        } 
        } 
       } 
      }, 
      "_index" : "test", 
      "_id" : "1", 
      "_type" : "test" 
     } 
     ], 
     "max_score" : 1, 
     "total" : 1 
    }, 
    "timed_out" : false, 
    "_shards" : { 
     "failed" : 0, 
     "successful" : 5, 
     "total" : 5 
    }, 
    "took" : 1 
} 
보조 노트에

은, 당신의 매핑에 대한 몇 가지 의견 :

  • 당신의 _id 필드 잘못된 수준에 (내가 의미하는 가정합니다 elasticsearch의 ID가 아닌 외부 ID가 될 수 있습니다) -가에 있어야 _type와 같은 수준입니다. 그것이 외부 ID라면 올바른 수준입니다.
  • 왜 모든 필드를 저장하고 있습니까? 필요가 없습니다. 단지 여분의 리소스 만 사용합니다. 대용량 _source 필드가 없으면 각 필드마다 디스크를 누르는 것이 아니라 해당 필드를 검색하여 구문 분석하는 것이 훨씬 빠릅니다.
+0

먼저 회신 해 주셔서 감사합니다. 이것은 내가 지금까지 탄성 검색에 관해서받은 첫 번째 괜찮은 대답이다! 메일 링리스트 나 IRC 채널조차도별로 도움이되지 않았습니다! 예, _id 필드는 외부 ID입니다. 모든 입력란을 저장하는 이유는 무엇입니까? 나는 정말로 모른다. 내가 그들을 저장하지 않는다면 그것은 색인을 생성하지 않을 것임을 의미합니다. 팁 고마워. 모두 실물 예제 또는 매우 자세한 예제에서는 설명서가 부족하다고 생각합니다. 너 나 많이 도와 줬어, 고마워! – Mark

+0

음 ...이 답변을 수락하고 싶지만 내 의견을 보내 주시겠습니까? – Mark