elasticsearch가 특정 필드 만 반환하도록 하시겠습니까?


답변:


620

네! 소스 필터를 사용하십시오 . JSON으로 검색하면 다음과 같이 보일 것입니다.

{
    "_source": ["user", "message", ...],
    "query": ...,
    "size": ...
}

ES 2.4 및 이전 버전에서는 fields 옵션을 사용하여 search API를 사용할 수도 있습니다 .

{
    "fields": ["user", "message", ...],
    "query": ...,
    "size": ...
}

ES 5 이상에서는 더 이상 사용되지 않습니다. 그리고 소스 필터는 더 강력합니다!


12
"stored"로 정의해야합니다. 매핑에서 true입니다. 그렇지 않으면 ES는 여전히 _source 문서를로드하고 필드를로드합니다. 반환 된 데이터가 전체 문서 크기에 비해 상대적으로 작 으면 성능에 영향을 줄 수 있습니다.
Zaar Hai

6
사실 : 당신은 "저장"을 의미
sscarduzio

이것들은 conf 파일에서 만들어 지거나 정확히 어디에 있습니까?
vbNewbie

@vbNewbie : 어디에서나 매핑을 정의하고 있습니다. 매핑을 명시 적으로 정의하지 않고이를 생성하기 위해 ES에 의존하는 경우 ES에 저장하려는 필드에 대한 매핑을 정의해야합니다. 특별한 동작을 원하는 필드 (예 : "store": true, "index": "not_analyzed") 또는 모든 필드에 대해서만 매핑을 정의 할 수 있습니다. 자세한 내용은 매핑 문서를 참조하십시오.
Sangharsh

3
최신 버전에서는 필드가 더 이상 지원되지 않습니다. stored_fields 대신 사용 :)
Sachin Sharma

88

에 대한 문서 get api가 도움이된다는 것을 알았습니다. 특히 소스 필터링필드 의 두 섹션 : https://www.elastic.co/guide/en/elasticsearch/reference/7.3/docs-get.html#get-source- 필터링

소스 필터링에 대해 설명합니다.

전체 _source에서 하나 또는 두 개의 필드 만 필요한 경우 _source_include 및 _source_exclude 매개 변수를 사용하여 필요한 부분을 포함하거나 필터링 할 수 있습니다. 이것은 부분 검색으로 네트워크 오버 헤드를 줄일 수있는 큰 문서에 특히 유용합니다.

내 유스 케이스를 완벽하게 맞았습니다. 나는 간단히 소스를 필터링하는 것처럼 끝났다 (속기를 사용하여).

{
    "_source": ["field_x", ..., "field_y"],
    "query": {      
        ...
    }
}

참고로, 그들은 문서에서 fields 매개 변수 에 대해 언급합니다 .

get 조작은 fields 매개 변수를 전달하여 리턴 될 저장된 필드 세트를 지정할 수있게합니다.

각 필드를 배열에 배치하는 특별히 저장된 필드를 제공하는 것 같습니다. 지정된 필드가 저장되지 않은 경우 _source에서 각 필드를 가져 오므로 '느린'검색이 발생할 수 있습니다. 또한 객체 유형의 필드를 반환하려고 시도하는 데 문제가있었습니다.

요약하면 소스 필터링 또는 [저장된] 필드를 통해 두 가지 옵션이 있습니다.


나를 위해 트릭을 했어. "fields"를 사용하여 geo_point를 반환하는 데 문제가 있었지만 "_source"는 제대로 작동합니다. 감사합니다!
Yonnaled

23
For the ES versions 5.X and above you can a ES query something like this

    GET /.../...
    {
      "_source": {
        "includes": [ "FIELD1", "FIELD2", "FIELD3" ... " ]
      },
      .
      .
      .
      .
    }

12

Elasticsearch 5.x에서는 위에서 언급 한 방식이 더 이상 사용되지 않습니다. _source 접근 방식을 사용할 수 있지만 특정 상황에서는 필드를 저장하는 것이 좋습니다. 예를 들어 제목, 날짜 및 매우 큰 내용 필드가있는 문서가있는 경우 큰 _source 필드에서 해당 필드를 추출하지 않고도 제목과 날짜 만 검색 할 수 있습니다.

이 경우 다음을 사용합니다.

{  
   "size": $INT_NUM_OF_DOCS_TO_RETURN,
   "stored_fields":[  
      "doc.headline",
      "doc.text",
      "doc.timestamp_utc"
   ],
   "query":{  
      "bool":{  
         "must":{  
            "term":{  
               "doc.topic":"news_on_things"
            }
         },
         "filter":{  
            "range":{  
               "doc.timestamp_utc":{  
                  "gte":1451606400000,
                  "lt":1483228800000,
                  "format":"epoch_millis"
               }
            }
         }
      }
   },
   "aggs":{  

   }
}

저장된 필드를 색인화하는 방법에 대한 문서를 참조하십시오. 공감대를 항상 기뻐하십시오!


7
here you can specify whichever field you want in your output and also which you don't.

  POST index_name/_search
    {
        "_source": {
            "includes": [ "field_name", "field_name" ],
            "excludes": [ "field_name" ]
        },
        "query" : {
            "match" : { "field_name" : "value" }
        }
    }



5

'_source'매개 변수를 사용하여 REST API GET 요청을 작성할 수 있습니다.

요청 예

http://localhost:9200/opt_pr/_search?q=SYMBOL:ITC AND OPTION_TYPE=CE AND TRADE_DATE=2017-02-10 AND EXPIRY_DATE=2017-02-23&_source=STRIKE_PRICE

응답

{
"took": 59,
"timed_out": false,
"_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
},
"hits": {
    "total": 104,
    "max_score": 7.3908954,
    "hits": [
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLc",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 160
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLh",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 185
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLi",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 190
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLm",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 210
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLp",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 225
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLr",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 235
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLw",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 260
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uL5",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 305
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLd",
            "_score": 7.381078,
            "_source": {
                "STRIKE_PRICE": 165
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLy",
            "_score": 7.381078,
            "_source": {
                "STRIKE_PRICE": 270
            }
        }
    ]
}

}


이것은 나에게 완전히 사용됩니다.
Suchitha Indunil

4

예. 소스 필터를 사용하여이를 수행 할 수 있습니다. 여기 문서 소스 필터링이 있습니다.

요청 예

POST index_name/_search
 {
   "_source":["field1","filed2".....] 
 }

출력은

{
  "took": 57,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "index_name",
        "_type": "index1",
        "_id": "1",
        "_score": 1,
        "_source": {
          "field1": "a",
          "field2": "b"
        },
        {
          "field1": "c",
          "field2": "d"
        },....
      }
    ]
  }
}

2

Java에서는 다음과 같이 setFetchSource를 사용할 수 있습니다.

client.prepareSearch(index).setTypes(type)
            .setFetchSource(new String[] { "field1", "field2" }, null)

2

예를 들어, 세 개의 필드가있는 문서가 있습니다.

PUT movie/_doc/1
{
  "name":"The Lion King",
  "language":"English",
  "score":"9.3"
}

반환 할 경우 namescore다음과 같은 명령을 사용할 수 있습니다 :

GET movie/_doc/1?_source_includes=name,score

패턴과 일치하는 일부 필드를 얻으려면 다음을 수행하십시오.

GET movie/_doc/1?_source_includes=*re

일부 필드는 제외하십시오.

GET movie/_doc/1?_source_excludes=score

0

Java API를 사용하여 다음을 사용하여 특정 필드 세트에서 모든 레코드를 가져옵니다.

public List<Map<String, Object>> getAllDocs(String indexName) throws IOException{
    int scrollSize = 1000;
    List<Map<String,Object>> data = new ArrayList<>();
    SearchResponse response = null;
    while( response == null || response.getHits().getHits().length != 0){
        response = client.prepareSearch(indexName)
            .setTypes("typeName")  // The document types to execute the search against. Defaults to be executed against all types.
        .setQuery(QueryBuilders.matchAllQuery())
        .setFetchSource(new String[]{"field1", "field2"}, null)
        .setSize(scrollSize)
        .execute()
        .actionGet();
        for(SearchHit hit : response.getHits()){
            System.out.println(hit.getSourceAsString());
        }
    }
    return data;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.