Truy vấn Elaticsearch để trả về tất cả các hồ sơ


490

Tôi có một cơ sở dữ liệu nhỏ trong Elaticsearch và cho mục đích thử nghiệm muốn lấy lại tất cả các hồ sơ. Tôi đang cố gắng sử dụng một URL có dạng ...

http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}

Ai đó có thể cho tôi URL bạn sẽ sử dụng để thực hiện việc này không?


1
... Trong đó "foo" là tên của chỉ mục bạn muốn hiển thị tất cả các bản ghi cho.
jonatan

Câu trả lời:


744

Tôi nghĩ cú pháp lucene được hỗ trợ như vậy:

http://localhost:9200/foo/_search?pretty=true&q=*:*

kích thước mặc định là 10, vì vậy bạn cũng có thể cần &size=BIGNUMBERnhận được hơn 10 mục. (trong đó BIGNUMBER bằng với số bạn tin là lớn hơn số liệu của bạn)

NHƯNG, tài liệu elaticsearch gợi ý cho các tập kết quả lớn, sử dụng kiểu tìm kiếm quét.

VÍ DỤ:

curl -XGET 'localhost:9200/foo/_search?search_type=scan&scroll=10m&size=50' -d '
{
    "query" : {
        "match_all" : {}
    }
}'

và sau đó tiếp tục yêu cầu theo liên kết tài liệu ở trên cho thấy.

EDIT: scanKhông dùng nữa trong 2.1.0.

scankhông cung cấp bất kỳ lợi ích nào so với scrollyêu cầu thông thường được sắp xếp theo _doc. liên kết đến tài liệu đàn hồi (được phát hiện bởi @ christophe-roussy)


6
Cảm ơn. Đây là lần cuối cùng tôi đưa ra kết quả trả về những gì tôi cần bây giờ ... localhost: 9200 / foo / _search? Size = 50 & beautiful = true & q = *: *
John Livermore

2
Thêm vào @ câu trả lời của Steve, bạn có thể tìm thấy một danh sách các thông số mà elasticsearch hiểu trong liên kết này elasticsearch.org/guide/reference/api/search/uri-request
Karthick

1
Cảm ơn @Steve cho câu trả lời của bạn. Tôi không nghĩ nó đủ quan trọng cho một câu hỏi mới. Nó không được nêu rõ ràng ở bất cứ đâu, vì vậy tôi đoán tôi sẽ hỏi ở đây chỉ để xác minh.
Churro

8
Bạn thực sự nên sử dụng quét + yêu cầu cuộn. Nếu bạn sử dụng size = BIGNUMBER, lưu ý rằng Lucene phân bổ bộ nhớ cho điểm số cho số đó, vì vậy đừng làm cho nó quá lớn. :)
Alex Brasetvik

4
Quét không được dùng nữa trong 2.1.0: thun.co / guide / en / elaticsearch / reference / civerse / Giả
Roussy

137
http://127.0.0.1:9200/foo/_search/?size=1000&pretty=1
                                   ^

Lưu ý kích thước param , làm tăng số lần truy cập được hiển thị từ mặc định (10) lên 1000 mỗi phân đoạn.

http://www.elaticsearch.org/guide/en/elSTERearch/reference/civerse/search-request-from-size.html


10
Mặc dù vậy, một điều cần lưu ý (từ tài liệu Elaticsearch): Lưu ý rằng từ + size không thể nhiều hơn chỉ số index.max_result_window, mặc định là 10.000.
dùng3078523

2
Điều này sẽ trả về 1000, không phải tất cả, người dùng3078523 đã đúng, phương pháp này có giới hạnmax_result_window
stelios

1
Nó có tối đa, và cũng (nếu bạn có hàng ngàn hồ sơ để có được), đó là một cách tiếp cận khá nặng nề để đi lên tới mức tối đa đó. Thay vào đó, bạn nên sử dụng truy vấn "cuộn".
Harry Wood

37

elaticsearch (ES) hỗ trợ cả yêu cầu GET hoặc POST để nhận dữ liệu từ chỉ mục cụm ES.

Khi chúng tôi thực hiện NHẬN:

http://localhost:9200/[your index name]/_search?size=[no of records you want]&q=*:*

Khi chúng tôi thực hiện POST:

http://localhost:9200/[your_index_name]/_search
{
  "size": [your value] //default 10
  "from": [your start index] //default 0
  "query":
   {
    "match_all": {}
   }
}   

Tôi sẽ đề nghị sử dụng plugin UI với elaticsearch http://mobz.github.io/elSTERearch-head/ Điều này sẽ giúp bạn có cảm giác tốt hơn về các chỉ số bạn tạo và cũng kiểm tra các chỉ mục của bạn.


3
Như một người dùng khác đã đề cập: from+ sizekhông thể nhiều hơn index.max_result_windowcài đặt chỉ mục mặc định là 10.000
stelios

Cách tiếp cận này có tối đa, và cũng (nếu bạn có hàng ngàn hồ sơ để nhận), đó là một cách tiếp cận khá nặng nề để đi lên tới mức tối đa đó. Thay vào đó, bạn nên sử dụng truy vấn "cuộn"
Harry Wood

Thật kỳ lạ, các tài liệu chính thức cho thấy curl -XGET ... -d '{...}'đó là một unkiểu yêu cầu hỗn hợp chính thức. Cảm ơn bạn đã hiển thị các định dạng GET và POST chính xác.
Jesse Chisholm

28

Lưu ý: Câu trả lời liên quan đến một phiên bản cũ hơn của Elaticsearch 0.90. Các phiên bản được phát hành kể từ đó có một cú pháp cập nhật. Vui lòng tham khảo các câu trả lời khác có thể cung cấp câu trả lời chính xác hơn cho câu trả lời mới nhất mà bạn đang tìm kiếm.

Truy vấn bên dưới sẽ trả về NO_OF_RESULTS mà bạn muốn được trả về ..

curl -XGET 'localhost:9200/foo/_search?size=NO_OF_RESULTS' -d '
{
"query" : {
    "match_all" : {}
  }
}'

Bây giờ, câu hỏi ở đây là bạn muốn tất cả các hồ sơ được trả lại. Vì vậy, một cách tự nhiên, trước khi viết một truy vấn, bạn sẽ không biết giá trị của NO_OF_RESULTS .

Làm thế nào để chúng tôi biết có bao nhiêu hồ sơ tồn tại trong tài liệu của bạn? Chỉ cần gõ truy vấn bên dưới

curl -XGET 'localhost:9200/foo/_search' -d '

Điều này sẽ cung cấp cho bạn một kết quả trông giống như dưới đây

 {
hits" : {
  "total" :       2357,
  "hits" : [
    {
      ..................

Kết quả tổng sẽ cho bạn biết có bao nhiêu hồ sơ có sẵn trong tài liệu của bạn. Vì vậy, đó là một cách hay để biết giá trị của KẾT QUẢ NO_OF

curl -XGET 'localhost:9200/_search' -d ' 

Tìm kiếm tất cả các loại trong tất cả các chỉ số

curl -XGET 'localhost:9200/foo/_search' -d '

Tìm kiếm tất cả các loại trong chỉ mục foo

curl -XGET 'localhost:9200/foo1,foo2/_search' -d '

Tìm kiếm tất cả các loại trong các chỉ số foo1 và foo2

curl -XGET 'localhost:9200/f*/_search

Tìm kiếm tất cả các loại trong bất kỳ chỉ số bắt đầu bằng f

curl -XGET 'localhost:9200/_all/type1,type2/_search' -d '

Tìm kiếm loại người dùng và tweet trong tất cả các chỉ số


9
Theo mặc định, ES sẽ trả về 10 kết quả trừ khi tham số kích thước được bao gồm trong truy vấn cơ sở.
lfender6445

Phản ứng trước đó là ba tuổi. Cập nhật nó thành một hiện tại.
vjpandian

19

Đây là giải pháp tốt nhất tôi tìm thấy khi sử dụng python client

  # Initialize the scroll
  page = es.search(
  index = 'yourIndex',
  doc_type = 'yourType',
  scroll = '2m',
  search_type = 'scan',
  size = 1000,
  body = {
    # Your query's body
    })
  sid = page['_scroll_id']
  scroll_size = page['hits']['total']

  # Start scrolling
  while (scroll_size > 0):
    print "Scrolling..."
    page = es.scroll(scroll_id = sid, scroll = '2m')
    # Update the scroll ID
    sid = page['_scroll_id']
    # Get the number of results that we returned in the last scroll
    scroll_size = len(page['hits']['hits'])
    print "scroll size: " + str(scroll_size)
    # Do something with the obtained page

https://gist.github.com/drorata/146ce50807d16fd4a6aa

Sử dụng máy khách java

import static org.elasticsearch.index.query.QueryBuilders.*;

QueryBuilder qb = termQuery("multi", "test");

SearchResponse scrollResp = client.prepareSearch(test)
        .addSort(FieldSortBuilder.DOC_FIELD_NAME, SortOrder.ASC)
        .setScroll(new TimeValue(60000))
        .setQuery(qb)
        .setSize(100).execute().actionGet(); //100 hits per shard will be returned for each scroll
//Scroll until no hits are returned
do {
    for (SearchHit hit : scrollResp.getHits().getHits()) {
        //Handle the hit...
    }

    scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet();
} while(scrollResp.getHits().getHits().length != 0); // Zero hits mark the end of the scroll and the while loop.

https://www.elastic.co/guide/en/elSTERearch/client/java-api/civerse/java-search-scrolling.html


Cảm ơn Mark, đó chính xác là những gì tôi đang tìm kiếm! Trong trường hợp của tôi (ELK 6.2.1, python 3), đối số search_type không hợp lệ và document_type không còn cần thiết nữa kể từ ELK 6.0
Christoph Schranz

Giải pháp hoàn hảo! Cảm ơn. Tôi đã sử dụng elasticsearch_dsl==5.4.0và nó hoạt động mà không có search_type = 'scan',.
Usman Maqbool

ES 6.3. Ví dụ này làm cho dịch vụ Elaticsearch của tôi gặp sự cố, cố gắng cuộn 110k tài liệu với size=10000, ở một nơi nào đó giữa các lần lặp thứ 5-7. với status=127, main ERROR Null object returned for RollingFile in Appenders, main ERROR Unable to locate appender "rolling" for logger config "root"Không đăng nhập vào/var/log/elasticsearch/elasticsearch.log
Stelios

Để ghi lại, các máy khách python thực hiện một trình scantrợ giúp thực hiện cuộn dưới mui xe (kể từ phiên bản 5.xx tại leat)
MCMZL

search_type = 'scan'bị phản đối Mã tương tự sẽ hoạt động mà không có điều đó, mặc dù có một số khác biệt thú vị được chôn giấu trong tài liệu cũ. thun.co/guide/en/elaticsearch/reference/1.4/ , Đặc biệt, khi di chuyển sang không sử dụng search_type = scan, truy vấn 'tìm kiếm' đầu tiên sẽ đi kèm với lô kết quả đầu tiên được xử lý.
Harry Wood

12

Elaticsearch sẽ trở nên chậm hơn đáng kể nếu bạn chỉ cần thêm một số lượng lớn như kích thước, một phương pháp để sử dụng để có được tất cả các tài liệu là sử dụng id quét và cuộn.

https://www.elastic.co/guide/en/elSTERearch/reference/civerse/search-request-scroll.html

Trong Elaticsearch v7.2, bạn làm như thế này:

POST /foo/_search?scroll=1m
{
    "size": 100,
    "query": {
        "match_all": {}
    }
}

Các kết quả từ điều này sẽ chứa một _scroll_id mà bạn phải truy vấn để có được 100 chunk tiếp theo.

POST /_search/scroll 
{
    "scroll" : "1m", 
    "scroll_id" : "<YOUR SCROLL ID>" 
}

1
Câu trả lời này cần cập nhật nhiều hơn. search_type=scanbây giờ không được dùng nữa Vì vậy, bạn nên loại bỏ điều đó, nhưng sau đó hành vi đã thay đổi một chút. Lô dữ liệu đầu tiên quay trở lại từ cuộc gọi tìm kiếm ban đầu. Liên kết bạn cung cấp không hiển thị cách chính xác để làm điều đó.
Harry Wood

1
Nhận xét của tôi thực sự cần lưu ý rằng bạn không thể chỉ thêm bất kỳ số nào theo kích thước, vì nó sẽ chậm hơn rất nhiều. Vì vậy, tôi đã loại bỏ ví dụ mã và mọi người có thể theo liên kết để có được mã chính xác.
WoodyDRN

1
@WoodyDRN Tốt hơn là nên có mã trong câu trả lời của bạn (ngay cả khi nó đã cũ) để nó vẫn có sẵn khi liên kết chết.
Đã xem

11

server:9200/_statscũng sử dụng để lấy số liệu thống kê về tất cả các bí danh của bạn .. như kích thước và số lượng phần tử cho mỗi bí danh, điều đó rất hữu ích và cung cấp thông tin hữu ích


2
Nhưng, từ những gì tôi nhớ, ES chỉ cho phép nhận 16000 dữ liệu cho mỗi yêu cầu. Vì vậy, nếu dữ liệu trên 16000, giải pháp này là không đủ.
Aminah Nuraini

10

Nếu bạn muốn lấy hàng ngàn bản ghi thì ... một vài người đã đưa ra câu trả lời đúng về việc sử dụng 'scroll' (Lưu ý: Một số người cũng đề xuất sử dụng "search_type = scan". Điều này không được chấp nhận và trong v5.0 đã bị xóa. Bạn không cần nó)

Bắt đầu với truy vấn 'tìm kiếm', nhưng chỉ định tham số 'cuộn' (ở đây tôi đang sử dụng thời gian chờ 1 phút):

curl -XGET 'http://ip1:9200/myindex/_search?scroll=1m' -d '
{
    "query": {
            "match_all" : {}
    }
}
'

Điều đó bao gồm 'đợt' đầu tiên của bạn. Nhưng chúng tôi không được thực hiện ở đây. Đầu ra của lệnh curl ở trên sẽ giống như thế này:

{ "_Scroll_id": "c2Nhbjs1OzUyNjE6NU4tU3BrWi1UWkNIWVNBZW43bXV3Zzs1Mzc3OkhUQ0g3VGllU2FhemJVNlM5d2t0alE7NTI2Mjo1Ti1TcGtaLVRaQ0hZU0FlbjdtdXdnOzUzNzg6SFRDSDdUaWVTYWF6YlU2Uzl3a3RqUTs1MjYzOjVOLVNwa1otVFpDSFlTQWVuN211d2c7MTt0b3RhbF9oaXRzOjIyNjAxMzU3Ow ==", "mất": 109, "timed_out": false, "_ mảnh": { "tổng": 5, "thành công": 5, "thất bại": 0} "hit" : {"tổng": 22601357, "max_score": 0.0, "lượt truy cập": []}}

Điều quan trọng là phải có _scroll_id vì tiếp theo bạn nên chạy lệnh sau:

    curl -XGET  'localhost:9200/_search/scroll'  -d'
    {
        "scroll" : "1m", 
        "scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1" 
    }
    '

Tuy nhiên, việc chuyển scroll_id xung quanh không phải là thứ được thiết kế để thực hiện thủ công. Đặt cược tốt nhất của bạn là viết mã để làm điều đó. ví dụ: trong java:

    private TransportClient client = null;
    private Settings settings = ImmutableSettings.settingsBuilder()
                  .put(CLUSTER_NAME,"cluster-test").build();
    private SearchResponse scrollResp  = null;

    this.client = new TransportClient(settings);
    this.client.addTransportAddress(new InetSocketTransportAddress("ip", port));

    QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
    scrollResp = client.prepareSearch(index).setSearchType(SearchType.SCAN)
                 .setScroll(new TimeValue(60000))                            
                 .setQuery(queryBuilder)
                 .setSize(100).execute().actionGet();

    scrollResp = client.prepareSearchScroll(scrollResp.getScrollId())
                .setScroll(new TimeValue(timeVal))
                .execute()
                .actionGet();

Bây giờ LOOP trên lệnh cuối cùng sử dụng SearchResponse để trích xuất dữ liệu.


6

Đơn giản! Bạn có thể sử dụng sizefromtham số!

http://localhost:9200/[your index name]/_search?size=1000&from=0

sau đó bạn thay đổi fromdần dần cho đến khi bạn nhận được tất cả dữ liệu.


4
không bao giờ sử dụng phương pháp này nếu dữ liệu chứa nhiều tài liệu ... Mỗi lần bạn vào "trang tiếp theo" Đàn hồi sẽ chậm hơn và chậm hơn! Sử dụng Tìm kiếm Sau khi thay thế
Joshlo

3
Ngoài ra, giải pháp này sẽ không hoạt động nếu kích thước dữ liệu tổng thể trên 10 000. Kích thước tùy chọn = 1000 & from = 10001 sẽ không thành công.
iclman

2
Quả thực thất bại. Tham số from+ sizekhông thể nhiều hơn index.max_result_window cài đặt chỉ mục mặc định là 10.000
stelios

1
Nếu dữ liệu chứa nhiều hàng ngàn tài liệu, câu trả lời đúng là sử dụng truy vấn 'cuộn'.
Harry Wood

Với fromsize-approach, bạn sẽ gặp phải vấn đề Phân trang sâu. Sử dụng API cuộn để tạo một bãi chứa tất cả các tài liệu.
Daniel Schneiter

5

Cách tốt nhất để điều chỉnh kích thước là sử dụng size = number trước URL

Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty"

Lưu ý: giá trị tối đa có thể được xác định trong kích thước này là 10000. Đối với bất kỳ giá trị nào trên mười nghìn, bạn nên sử dụng chức năng cuộn để giảm thiểu mọi khả năng ảnh hưởng đến hiệu suất.


Kể từ phiên bản nào kích thước tối đa xảy ra?
WoodyDRN

Đó có thể là cách "tốt nhất" cho đến một điểm, nhưng thực sự có một chút gật đầu. Nếu bạn có nhiều nghìn bản ghi, thì cách tốt nhất là truy vấn "cuộn".
Harry Wood

Với cách tiếp cận từ và kích thước, bạn sẽ gặp phải vấn đề Phân trang sâu. Sử dụng API cuộn để tạo một bãi chứa tất cả các tài liệu.
Daniel Schneiter

5

Bạn có thể sử dụng _countAPI để lấy giá trị cho sizetham số:

http://localhost:9200/foo/_count?q=<your query>

Trả về {count:X, ...}. Trích xuất giá trị 'X' và sau đó thực hiện truy vấn thực tế:

http://localhost:9200/foo/_search?q=<your query>&size=X

1
Đặt kích thước thành X như thế này, có thể có một trục trặc đồng thời đáng ngạc nhiên: Hãy xem xét điều gì xảy ra nếu một bản ghi được thêm vào giữa việc đếm và đặt kích thước cho truy vấn tiếp theo của bạn ... nhưng cũng có nếu bạn có hàng ngàn bản ghi để nhận , đó là cách tiếp cận sai. Thay vào đó, bạn nên sử dụng truy vấn "cuộn".
Harry Wood


4

kích thước param tăng số lần truy cập được hiển thị từ mặc định (10) lên 500.

http: // localhost: 9200 / [indexName] / _search? beautiful = true & size = 500 & q = *: *

Thay đổi từ từng bước để có được tất cả các dữ liệu.

http: // localhost: 9200 / [indexName] / _search? size = 500 & from = 0

3

Đối với Elaticsearch 6.x

Yêu cầu: GET /foo/_search?pretty=true

Trả lời: Trong Tổng số lượt truy cập->, hãy đếm số lượng tài liệu

    {
      "took": 1,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1001,
        "max_score": 1,
        "hits": [
          {

3

Nếu đó là một tập dữ liệu nhỏ (ví dụ: bản ghi 1K) , bạn chỉ cần chỉ định size:

curl localhost:9200/foo_index/_search?size=1000

Tất cả các truy vấn không cần thiết, vì nó ẩn.

Nếu bạn có bộ dữ liệu cỡ trung bình, như các bản ghi 1M , bạn có thể không có đủ bộ nhớ để tải nó, vì vậy bạn cần một cuộn .

Một cuộn giống như một con trỏ trong DB. Trong Elaticsearch, nó ghi nhớ nơi bạn rời đi và giữ cùng một chế độ xem chỉ mục (nghĩa là ngăn người tìm kiếm đi xa với làm mới , ngăn các phân đoạn hợp nhất ).

API-khôn ngoan, bạn phải thêm một tham số cuộn cho yêu cầu đầu tiên:

curl 'localhost:9200/foo_index/_search?size=100&scroll=1m&pretty'

Bạn lấy lại trang đầu tiên và ID cuộn:

{
  "_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADEWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ==",
  "took" : 0,
...

Nhớ lấy cả ID cuộn bạn nhận được và thời gian chờ đều hợp lệ cho trang tiếp theo . Một lỗi phổ biến ở đây là chỉ định thời gian chờ rất lớn (giá trị củascroll ), sẽ bao gồm để xử lý toàn bộ tập dữ liệu (ví dụ: bản ghi 1M) thay vì một trang (ví dụ 100 bản ghi).

Để có trang tiếp theo, hãy điền ID cuộn cuối cùng và thời gian chờ sẽ kéo dài cho đến khi tìm nạp trang sau:

curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/_search/scroll' -d '{
  "scroll": "1m",
  "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADAWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ=="
}'

Nếu bạn có nhiều thứ để xuất (ví dụ: tài liệu 1B) , bạn sẽ muốn song song. Điều này có thể được thực hiện thông qua cuộn cắt lát . Nói rằng bạn muốn xuất trên 10 chủ đề. Chuỗi đầu tiên sẽ đưa ra một yêu cầu như thế này:

curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/test/_search?scroll=1m&size=100' -d '{
  "slice": {
    "id": 0, 
    "max": 10 
  }
}'

Bạn lấy lại trang đầu tiên và ID cuộn, giống hệt như yêu cầu cuộn thông thường. Bạn sẽ sử dụng chính xác như một cuộn thông thường, ngoại trừ việc bạn nhận được 1/10 dữ liệu.

Các chủ đề khác sẽ làm tương tự, ngoại trừ đó idsẽ là 1, 2, 3 ...



2

Theo mặc định, Elaticsearch trả lại 10 bản ghi để kích thước được cung cấp rõ ràng.

Thêm kích thước với yêu cầu để có được số lượng hồ sơ mong muốn.

http: // {host}: 9200 / {index_name} / _search? beautiful = true & size = (số lượng bản ghi)

Lưu ý: Kích thước trang tối đa không thể nhiều hơn index.max_result_window cài đặt chỉ mục mặc định là 10.000.


2

Từ Kibana DevTools của nó:

GET my_index_name/_search
{
  "query": {
    "match_all": {}
  }
}

2

Một giải pháp đơn giản bằng cách sử dụng gói python elaticsearch-dsl :

from elasticsearch_dsl import Search
from elasticsearch_dsl import connections

connections.create_connection(hosts=['localhost'])

s = Search(index="foo")
response = s.scan()

count = 0
for hit in response:
    # print(hit.to_dict())  # be careful, it will printout every hit in your index
    count += 1

print(count)

Xem thêm https://elaticsearch-dsl.readthedocs.io/en/latest/api.html#elaticsearch_dsl.Search.scan .


1

Kết quả tối đa sẽ trả về bởi thunSearch là 10000 bằng cách cung cấp kích thước

curl -XGET 'localhost:9200/index/type/_search?scroll=1m' -d '
{
   "size":10000,
   "query" : {
   "match_all" : {}
    }
}'

Sau đó, bạn phải sử dụng API cuộn để nhận kết quả và nhận giá trị _scroll_id và đặt giá trị này vào scroll_id

curl -XGET  'localhost:9200/_search/scroll'  -d'
{
   "scroll" : "1m", 
   "scroll_id" : "" 
}'

API cuộn nên được sử dụng ngay từ đầu với yêu cầu đầu tiên.
Daniel Schneiter

1

Các tài liệu chính thức cung cấp câu trả lời cho câu hỏi này! bạn có thể tìm thấy nó ở đây .

{
  "query": { "match_all": {} },
  "size": 1
}

Bạn chỉ cần thay thế kích thước (1) bằng số lượng kết quả bạn muốn xem!


Tác giả của câu hỏi đã yêu cầu kết quả 'tất cả', không phải là số lượng kết quả được xác định trước. Mặc dù rất hữu ích khi đăng một liên kết đến các tài liệu, các tài liệu không mô tả làm thế nào để đạt được điều đó, câu trả lời của bạn cũng không.
Maarten00

Với cách tiếp cận từ và kích thước, bạn sẽ gặp phải vấn đề Phân trang sâu. Sử dụng API cuộn để tạo một bãi chứa tất cả các tài liệu.
Daniel Schneiter

0

Để trả về tất cả các hồ sơ từ tất cả các chỉ số bạn có thể làm:

curl -XGET http://35.195.120.21:9200/_all/_search?size=50&pretty

Đầu ra:

  "took" : 866,
  "timed_out" : false,
  "_shards" : {
    "total" : 25,
    "successful" : 25,
    "failed" : 0
  },
  "hits" : {
    "total" : 512034694,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "grafana-dash",
      "_type" : "dashboard",
      "_id" : "test",
      "_score" : 1.0,
       ...

0
curl -XGET '{{IP/localhost}}:9200/{{Index name}}/{{type}}/_search?scroll=10m&pretty' -d '{
"query": {
"filtered": {
"query": {
"match_all": {}
}}'

Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
Stamos

0

Không có gì ngoại trừ @Akira Sendoh đã trả lời làm thế nào để thực sự có được TẤT CẢ các tài liệu. Nhưng ngay cả giải pháp đó cũng làm sập dịch vụ ES 6.3 của tôi mà không có nhật ký. Điều duy nhất làm việc cho tôi khi sử dụng elasticsearch-pythư viện cấp thấp là thông qua trình trợ giúp quét sử dụng scroll()api:

from elasticsearch.helpers import scan

doc_generator = scan(
    es_obj,
    query={"query": {"match_all": {}}},
    index="my-index",
)

# use the generator to iterate, dont try to make a list or you will get out of RAM
for doc in doc_generator:
    # use it somehow

Tuy nhiên, cách sạch hơn hiện nay dường như là thông qua elasticsearch-dslthư viện, cung cấp các cuộc gọi trừu tượng hơn, gọn gàng hơn, ví dụ: http://elaticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hits


0

Nếu vẫn có ai đó đang tìm kiếm tất cả dữ liệu được lấy từ Elaticsearch như tôi cho một số usecase, thì đây là những gì tôi đã làm. Hơn nữa, tất cả các dữ liệu có nghĩa là, tất cả các chỉ mục và tất cả các loại tài liệu. Tôi đang sử dụng Elaticsearch 6.3

curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
    "query": {
        "match_all": {}
    }
}
'

Tài liệu tham khảo


0

đây là truy vấn để thực hiện những gì bạn muốn, (tôi khuyên bạn nên sử dụng Kibana, vì nó giúp hiểu các truy vấn tốt hơn)

GET my_index_name/my_type_name/_search
{
   "query":{
      "match_all":{}
   },
   size : 20,
   from : 3
}

để có được tất cả các bản ghi bạn phải sử dụng truy vấn "match_all".

kích thước là không có bản ghi bạn muốn tìm nạp (loại giới hạn). theo mặc định, ES sẽ chỉ trả lại 10 bản ghi

từ giống như bỏ qua, bỏ qua 3 hồ sơ đầu tiên.

Nếu bạn muốn tìm nạp chính xác tất cả các bản ghi, chỉ cần sử dụng giá trị từ trường "tổng" từ kết quả khi bạn nhấn truy vấn này từ Kibana và sử dụng nó với "kích thước".


Giới hạn của truy vấn này là kích thước + từ phải thấp hơn hoặc bằng "index.max_result_window". Đối với số lượng lớn tài liệu (theo mặc định 10000+) truy vấn này không được áp dụng.
KarelHusa

0

Sử dụng Elaticsearch 7.5.1

http://${HOST}:9200/${INDEX}/_search?pretty=true&q=*:*&scroll=10m&size=5000

trong trường hợp bạn cũng có thể chỉ định kích thước của mảng với & size = $ {number}

trong trường hợp bạn không biết bạn lập chỉ mục

http://${HOST}:9200/_cat/indices?v

0

Sử dụng bảng điều khiển kibana và my_index làm chỉ mục để tìm kiếm sau đây có thể được đóng góp. Yêu cầu chỉ mục chỉ trả về 4 trường của chỉ mục, bạn cũng có thể thêm kích thước để cho biết có bao nhiêu tài liệu mà bạn muốn được chỉ mục trả về. Kể từ ES 7.6, bạn nên sử dụng _source thay vì bộ lọc, nó sẽ phản hồi nhanh hơn.

GET /address/_search
 {
   "_source": ["streetaddress","city","state","postcode"],
   "size": 100,
   "query":{
   "match_all":{ }
    }   
 }

-5

Bạn có thể sử dụng size = 0, điều này sẽ trả về cho bạn tất cả các ví dụ về tài liệu

curl -XGET 'localhost:9200/index/type/_search' -d '
{
   size:0,
   "query" : {
   "match_all" : {}
    }
}'

1
Điều này sẽ trả về thông tin tích lũy, nhưng không phải là lượt truy cập
user732456
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.