Làm cho elaticsearch chỉ trả lại các lĩnh vực nhất định?


Câu trả lời:


619

Vâng! Sử dụng bộ lọc nguồn . Nếu bạn đang tìm kiếm bằng JSON, nó sẽ trông giống như thế này:

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

Trong ES 2.4 trở về trước, bạn cũng có thể sử dụng tùy chọn trường cho API tìm kiếm :

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

Điều này không được chấp nhận trong ES 5+. Và bộ lọc nguồn dù sao cũng mạnh hơn!


12
đảm bảo định nghĩa chúng là "được lưu trữ": đúng trong ánh xạ. Nếu không, ES vẫn sẽ tải tài liệu _source và tải các trường từ đó. Hiệu suất có thể ảnh hưởng nếu dữ liệu được trả về tương đối nhỏ so với kích thước của toàn bộ tài liệu.
Zaar Hai

6
bạn có nghĩa là "cửa hàng": đúng
sscarduzio

Chúng được làm trong tập tin conf hay chính xác ở đâu?
vbNewbie

@vbNewbie: Nơi nào bạn đang xác định ánh xạ. Nếu bạn không xác định ánh xạ rõ ràng và dựa vào ES để tạo nó, thì bạn sẽ phải xác định ánh xạ cho các trường bạn muốn ES lưu trữ. Bạn có thể xác định ánh xạ chỉ cho các trường mà bạn muốn có hành vi đặc biệt (ví dụ: "store": true, "index": "not_analyened") hoặc tất cả các trường. Nhìn vào tài liệu bản đồ để biết thêm chi tiết.
Sangharsh

3
các trường không còn được hỗ trợ trên các phiên bản mới hơn. sử dụng archive_fields thay thế :)
Sachin Sharma

88

Tôi thấy các tài liệu get apihữu ích - đặc biệt là hai phần, Lọc nguồnTrường : https://www.elastic.co/guide/en/elSTERearch/reference/7.3/docs-get.html#get-source- lọc

Họ nói về lọc nguồn:

Nếu bạn chỉ cần một hoặc hai trường từ _source hoàn chỉnh, bạn có thể sử dụng các tham số _source_include & _source_exclude để bao gồm hoặc lọc ra các phần bạn cần. Điều này có thể đặc biệt hữu ích với các tài liệu lớn, nơi truy xuất một phần có thể tiết kiệm chi phí mạng

Mà trang bị trường hợp sử dụng của tôi hoàn hảo. Cuối cùng tôi chỉ đơn giản là lọc nguồn như vậy (sử dụng tốc ký):

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

FYI, họ nêu trong các tài liệu về tham số trường :

Hoạt động get cho phép chỉ định một tập hợp các trường được lưu trữ sẽ được trả về bằng cách chuyển tham số trường.

Nó dường như để phục vụ cho các trường đã được lưu trữ cụ thể, nơi nó đặt từng trường trong một mảng. Nếu các trường được chỉ định chưa được lưu trữ, nó sẽ tìm nạp từng trường từ _source, điều này có thể dẫn đến việc truy xuất 'chậm hơn'. Tôi cũng gặp khó khăn khi cố gắng đưa nó trở về các trường của loại đối tượng.

Vì vậy, tóm lại, bạn có hai tùy chọn, dù là lọc nguồn hoặc các trường [được lưu trữ].


Đã lừa tôi. Tôi gặp vấn đề với việc trả về Geo_point bằng cách sử dụng "các trường", nhưng "_source" hoạt động tốt, cảm ơn!
Kết nối

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

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

12

Trong Elaticsearch 5.x cách tiếp cận được đề cập ở trên không được chấp nhận. Bạn có thể sử dụng phương pháp _source, nhưng trong một số trường hợp nhất định, việc lưu trữ một trường có ý nghĩa. Ví dụ: nếu bạn có một tài liệu có tiêu đề, ngày tháng và trường nội dung rất lớn, bạn có thể muốn truy xuất chỉ tiêu đề và ngày mà không phải trích xuất các trường đó từ trường _source lớn:

Trong trường hợp này, bạn sẽ sử dụng:

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

   }
}

Xem tài liệu về cách lập chỉ mục các trường được lưu trữ. Luôn luôn hạnh phúc cho một Upvote!


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

7

answer_filtering

Tất cả các API REST chấp nhận tham số filter_path có thể được sử dụng để giảm phản hồi được trả về bởi elaticsearch. Tham số này có một danh sách các bộ lọc được phân tách bằng dấu phẩy được thể hiện bằng ký hiệu dấu chấm.

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


6

Đây là một giải pháp khác, hiện đang sử dụng biểu thức khớp

Lọc nguồn
Cho phép kiểm soát cách trường _source được trả về với mỗi lần truy cập.

Đã thử nghiệm với Elastiscsearch phiên bản 5.5

Từ khóa "bao gồm" xác định các trường cụ thể.

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

5

Yêu cầu GET API REST có thể được thực hiện với tham số '_source'.

Yêu cầu ví dụ

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

Phản ứng

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

}


Điều này là rất sử dụng đầy đủ cho tôi.
Doesitha Indunil

4

Có bằng cách sử dụng bộ lọc nguồn, bạn có thể thực hiện việc này, đây là bộ lọc nguồn doc

Yêu cầu ví dụ

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

Đầu ra sẽ là

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

Trong java, bạn có thể sử dụng setFetchSource như thế này:

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

2

Ví dụ: bạn có một tài liệu với ba trường:

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

Nếu bạn muốn quay lại namescorebạn có thể sử dụng lệnh sau:

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

Nếu bạn muốn có được một số trường phù hợp với một mẫu:

GET movie/_doc/1?_source_includes=*re

Có thể loại trừ một số lĩnh vực:

GET movie/_doc/1?_source_excludes=score

0

Sử dụng API Java, tôi sử dụng cách sau để nhận tất cả các bản ghi từ một nhóm các trường cụ thể:

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.