Tôi đang sử dụng elaticsearch để lập chỉ mục các tài liệu của tôi.
Có thể hướng dẫn nó chỉ trả về các trường cụ thể thay vì toàn bộ tài liệu json mà nó đã lưu trữ không?
Tôi đang sử dụng elaticsearch để lập chỉ mục các tài liệu của tôi.
Có thể hướng dẫn nó chỉ trả về các trường cụ thể thay vì toàn bộ tài liệu json mà nó đã lưu trữ không?
Câu trả lời:
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!
Tôi thấy các tài liệu get api
hữu ích - đặc biệt là hai phần, Lọc nguồn và Trườ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ữ].
For the ES versions 5.X and above you can a ES query something like this
GET /.../...
{
"_source": {
"includes": [ "FIELD1", "FIELD2", "FIELD3" ... " ]
},
.
.
.
.
}
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!
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.
Đâ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%"
}
}
]
}
}
}
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
}
}
]
}
}
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"
},....
}
]
}
}
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)
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 name
và score
bạ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
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;
}