elasticsearch를 사용하여 문서를 색인화하고 있습니다.
저장된 전체 json 문서 대신 특정 필드 만 반환하도록 지시 할 수 있습니까?
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에서 각 필드를 가져 오므로 '느린'검색이 발생할 수 있습니다. 또한 객체 유형의 필드를 반환하려고 시도하는 데 문제가있었습니다.
요약하면 소스 필터링 또는 [저장된] 필드를 통해 두 가지 옵션이 있습니다.
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":{
}
}
저장된 필드를 색인화하는 방법에 대한 문서를 참조하십시오. 공감대를 항상 기뻐하십시오!
모든 REST API는 elasticsearch에서 리턴 한 응답을 줄이는 데 사용할 수있는 filter_path 매개 변수를 승인합니다. 이 매개 변수는 점 표기법으로 표현 된 쉼표로 구분 된 필터 목록을 사용합니다.
이제 일치 식을 사용하는 또 다른 솔루션
소스 필터링
적중마다 _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%"
}
}
]
}
}
}
'_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
}
}
]
}
}
예. 소스 필터를 사용하여이를 수행 할 수 있습니다. 여기 문서 소스 필터링이 있습니다.
요청 예
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"
},....
}
]
}
}
Java에서는 다음과 같이 setFetchSource를 사용할 수 있습니다.
client.prepareSearch(index).setTypes(type)
.setFetchSource(new String[] { "field1", "field2" }, null)
예를 들어, 세 개의 필드가있는 문서가 있습니다.
PUT movie/_doc/1
{
"name":"The Lion King",
"language":"English",
"score":"9.3"
}
반환 할 경우 name
와 score
다음과 같은 명령을 사용할 수 있습니다 :
GET movie/_doc/1?_source_includes=name,score
패턴과 일치하는 일부 필드를 얻으려면 다음을 수행하십시오.
GET movie/_doc/1?_source_includes=*re
일부 필드는 제외하십시오.
GET movie/_doc/1?_source_excludes=score
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;
}