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

elasticsearch를 사용하여 문서를 색인화하고 있습니다.

저장된 전체 json 문서 대신 특정 필드 만 반환하도록 지시 할 수 있습니까?



답변

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

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

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

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

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


답변

에 대한 문서 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에서 각 필드를 가져 오므로 ‘느린’검색이 발생할 수 있습니다. 또한 객체 유형의 필드를 반환하려고 시도하는 데 문제가있었습니다.

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


답변

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

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


답변

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":{

   }
}

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


답변

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" }
        }
    }


답변

response_filtering

모든 REST API는 elasticsearch에서 리턴 한 응답을 줄이는 데 사용할 수있는 filter_path 매개 변수를 승인합니다. 이 매개 변수는 점 표기법으로 표현 된 쉼표로 구분 된 필터 목록을 사용합니다.

https://stackoverflow.com/a/35647027/844700


답변

이제 일치 식을 사용하는 또 다른 솔루션

소스 필터링
적중마다 _source 필드가 리턴되는 방법을 제어 할 수 있습니다.

Elastiscsearch 버전 5.5에서 테스트

“includes” 키워드 는 특정 필드를 정의합니다.

GET /my_indice/my_indice_type/_search
{
    "_source": {
        "includes": [ "my_especific_field"]
        },
        "query": {
        "bool": {
                "must": [
                {"match": {
                    "_id": "%my_id_here_without_percent%"
                    }
                }
            ]
        }
    }
}