Elasticsearch แบบสอบถามเพื่อส่งกลับระเบียนทั้งหมด


490

ฉันมีฐานข้อมูลขนาดเล็กใน Elasticsearch และเพื่อการทดสอบต้องการดึงระเบียนทั้งหมดกลับคืน ฉันกำลังพยายามใช้ URL ของแบบฟอร์ม ...

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

มีคนให้ URL ที่คุณจะใช้ให้ฉันเพื่อทำสิ่งนี้ได้ไหม


1
... โดยที่ "foo" เป็นชื่อของดัชนีที่คุณต้องการแสดงระเบียนทั้งหมด
jonatan

คำตอบ:


744

ฉันคิดว่ามีการรองรับไวยากรณ์ของลูซิน:

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

ขนาดเริ่มต้นที่ 10 ดังนั้นคุณอาจต้อง&size=BIGNUMBERได้รับมากกว่า 10 รายการ (โดยที่ BIGNUMBER เท่ากับจำนวนที่คุณเชื่อว่าใหญ่กว่าชุดข้อมูลของคุณ)

แต่เอกสาร elasticsearch แนะนำสำหรับชุดผลลัพธ์ขนาดใหญ่โดยใช้ประเภทการสแกนการค้นหา

เช่น:

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

แล้วขอต่อตามลิงค์เอกสารด้านบนแนะนำ

แก้ไข: scanเลิกใช้แล้วใน 2.1.0

scanไม่ได้ให้ผลประโยชน์ใด ๆ ที่มากกว่าปกติคำขอเรียงตามscroll ลิงก์ไปยังเอกสารแบบยืดหยุ่น (พบโดย @ christophe-roussy)_doc


6
ขอบคุณ นี่เป็นครั้งสุดท้ายที่ฉันพบว่าสิ่งที่ฉันต้องการตอนนี้กลับมาแล้ว ... localhost: 9200 / foo / _search? size = 50 & pretty = true & q = *: *
John Livermore

2
เมื่อเพิ่มคำตอบของ @ Steve คุณสามารถดูรายการพารามิเตอร์ที่ elasticsearch เข้าใจได้ในลิงก์นี้elasticsearch.org/guide/reference/api/search/uri-request
Karthick

1
ขอบคุณ @Steve สำหรับคำตอบของคุณ ฉันไม่คิดว่ามันสำคัญพอสำหรับคำถามใหม่ มันไม่ได้ระบุไว้อย่างชัดเจนเลยฉันจึงคิดว่าฉันจะขอให้ที่นี่ยืนยัน
Churro

8
คุณควรใช้ scan + scroll-ร้องขอจริงๆ หากคุณใช้ size = BIGNUMBER โปรดทราบว่า Lucene จะจัดสรรหน่วยความจำสำหรับคะแนนสำหรับหมายเลขนั้นดังนั้นอย่าทำให้มีขนาดใหญ่เกินไป :)
Alex Brasetvik

4
สแกนได้รับการคัดค้านในคัดค้านใน 2.1.0: elastic.co/guide/en/elasticsearch/reference/current/...
Christophe Roussy

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

สังเกตขนาดของ paramซึ่งเพิ่มจำนวนครั้งที่แสดงจากค่าเริ่มต้น (10) ถึง 1,000 ต่อชิ้น

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-from-size.html


10
สิ่งหนึ่งที่ต้องจำไว้ (จาก Elasticsearch docs): โปรดทราบว่าจากขนาด + ต้องไม่เกินการตั้งค่า index.max_result_window ซึ่งเป็นค่าเริ่มต้นที่ 10,000
3078523

2
สิ่งนี้จะคืน 1,000 ไม่ใช่ทั้งหมดผู้ใช้ 3078523 ถูกต้องวิธีนี้มีขีด จำกัดmax_result_window
stelios

1
มันมีจำนวนสูงสุดและ (ถ้าคุณมีหลายพันรายการที่จะได้รับ) มันเป็นวิธีการที่ค่อนข้างงี่เง่าที่จะขึ้นสู่จุดสูงสุดนั้น คุณควรใช้แบบสอบถาม "เลื่อน" แทน
แฮร์รี่วู้ด

37

elasticsearch (ES) รองรับการร้องขอ GET หรือ POST สำหรับรับข้อมูลจากดัชนีคลัสเตอร์ ES

เมื่อเราได้รับ:

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

เมื่อเราทำ POST:

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

ฉันขอแนะนำให้ใช้ปลั๊กอิน UI พร้อม elasticsearch http://mobz.github.io/elasticsearch-head/ สิ่งนี้จะช่วยให้คุณเข้าใจดัชนีที่คุณสร้างและทดสอบดัชนีของคุณได้ดียิ่งขึ้น


3
ดังที่ผู้ใช้รายอื่นกล่าวถึง: from+ sizeต้องไม่เกินการindex.max_result_windowตั้งค่าดัชนีซึ่งเป็นค่าเริ่มต้นที่ 10,000
stelios

วิธีการนี้มีค่าสูงสุดและ (ถ้าคุณมีหลายพันรายการที่จะได้รับ) มันเป็นวิธีที่ค่อนข้างน่าเบื่อที่จะขึ้นสู่จุดสูงสุดนั้น คุณควรใช้แบบสอบถาม "เลื่อน" แทน
Harry Wood

เอกสารที่เป็นทางการแสดงให้เห็นcurl -XGET ... -d '{...}'ว่าเป็นunรูปแบบที่หลากหลายอย่างเป็นทางการของคำขอ ขอขอบคุณที่แสดงรูปแบบ GET และ POST ที่ถูกต้อง
Jesse Chisholm

28

หมายเหตุ:คำตอบที่เกี่ยวข้องกับรุ่นเก่าของ 0.90ElasticSearch รุ่นที่วางจำหน่ายตั้งแต่นั้นมีไวยากรณ์ที่อัปเดตแล้ว โปรดอ้างอิงคำตอบอื่น ๆ ที่อาจให้คำตอบที่แม่นยำยิ่งขึ้นสำหรับคำตอบล่าสุดที่คุณกำลังมองหา

แบบสอบถามด้านล่างนี้จะส่งคืน NO_OF_RESULTS ที่คุณต้องการจะส่งคืน ..

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

ตอนนี้คำถามที่นี่คือที่ที่คุณต้องการทุกระเบียนที่จะถูกส่งกลับ ดังนั้นธรรมชาติก่อนที่จะเขียนแบบสอบถามคุณเคยชินรู้ค่าของNO_OF_RESULTS

เราจะทราบจำนวนระเบียนที่มีอยู่ในเอกสารของคุณได้อย่างไร เพียงพิมพ์ข้อความค้นหาด้านล่าง

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

นี่จะให้ผลลัพธ์ที่ดูเหมือนกับด้านล่าง

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

ผลรวมจะบอกจำนวนระเบียนที่มีอยู่ในเอกสารของคุณ นั่นเป็นวิธีที่ดีในการทราบคุณค่าของNO_OF RESULTS

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

ค้นหาทุกประเภทในดัชนีทั้งหมด

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

ค้นหาทุกประเภทในดัชนีฟู

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

ค้นหาทุกประเภทในดัชนี foo1 และ foo2

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

ค้นหาทุกประเภทในดัชนีใด ๆ ที่ขึ้นต้นด้วย f

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

ค้นหาประเภทผู้ใช้และทวีตในดัชนีทั้งหมด


9
โดยค่าเริ่มต้น ES จะส่งคืนผลลัพธ์ 10 รายการยกเว้นว่ามีขนาดพารามิเตอร์รวมอยู่ในแบบสอบถามพื้นฐาน
lfender6445

คำตอบก่อนหน้านี้คือสามปี อัปเดตเป็นรุ่นปัจจุบัน
vjpandian

19

นี่เป็นทางออกที่ดีที่สุดที่ฉันพบโดยใช้ไคลเอนต์หลาม

  # 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

ใช้ไคลเอนต์ 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/elasticsearch/client/java-api/current/java-search-scrolling.html


ขอบคุณมาร์คนั่นคือสิ่งที่ฉันกำลังมองหา! ในกรณีของฉัน (ELK 6.2.1, python 3) อาร์กิวเมนต์ search_type ไม่ถูกต้องและ document_type ไม่ต้องการอีกต่อไปตั้งแต่ ELK 6.0
Christoph Schranz

โซลูชั่นที่สมบูรณ์แบบ! ขอบคุณ ผมใช้และทำงานได้โดยไม่ต้องelasticsearch_dsl==5.4.0 search_type = 'scan',
Usman Maqbool

ES 6.3 ตัวอย่างนี้ทำให้บริการ Elasticsearch ของฉันเกิดความผิดพลาดพยายามเลื่อนเอกสาร 110k ด้วยsize=10000ที่ใดที่หนึ่งระหว่างการทำซ้ำที่5-7 ด้วยstatus=127,main ERROR Null object returned for RollingFile in Appenders , main ERROR Unable to locate appender "rolling" for logger config "root"ไม่มีบันทึกใน/var/log/elasticsearch/elasticsearch.log
Stelios

สำหรับเร็กคอร์ดนั้นไพ ธ อนไคลเอ็นต์ใช้ a scanช่วยซึ่งทำหน้าที่เลื่อนภายใต้ประทุน (ตั้งแต่รุ่น 5.xx ตอน leat)
MCMZL

search_type = 'scan'เลิกใช้แล้ว รหัสที่คล้ายกันจะใช้งานไม่ได้แม้ว่าจะมีความแตกต่างที่น่าสนใจซึ่งฝังอยู่ในเอกสารเก่า elastic.co/guide/en/elasticsearch/reference/1.4/… โดยเฉพาะอย่างยิ่งเมื่อย้ายไปที่ไม่ใช้ search_type = scan คำค้นหา 'ค้นหา' ครั้งแรกจะมาพร้อมกับผลลัพธ์ชุดแรกที่จะประมวลผล
แฮร์รี่วู้ด

12

Elasticsearch จะช้าลงอย่างมีนัยสำคัญหากคุณเพิ่มจำนวนมากเป็นขนาดวิธีหนึ่งที่จะใช้ในการรับเอกสารทั้งหมดคือการใช้การสแกนและรหัสเลื่อน

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html

ใน Elasticsearch v7.2 คุณทำเช่นนี้:

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

ผลลัพธ์จากสิ่งนี้จะมี _scroll_id ซึ่งคุณต้องค้นหาเพื่อรับ 100 อันถัดไป

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

1
คำตอบนี้ต้องการการปรับปรุงเพิ่มเติม search_type=scanเลิกใช้แล้ว ดังนั้นคุณควรลบสิ่งนั้นออก แต่พฤติกรรมนั้นเปลี่ยนไปเล็กน้อย ชุดข้อมูลชุดแรกกลับมาจากการค้นหาเริ่มต้น ลิงค์ที่คุณระบุจะแสดงวิธีการที่ถูกต้อง
แฮร์รี่วู้ด

1
ความคิดเห็นของฉันเป็นจริงที่จะทราบว่าคุณไม่สามารถเพียงแค่เพิ่มจำนวนใด ๆ เป็นขนาดเพราะมันจะช้าลงมาก ดังนั้นฉันจึงลบตัวอย่างรหัสและผู้คนสามารถติดตามลิงก์เพื่อรับรหัสที่ถูกต้องได้
WoodyDRN

1
@WoodyDRN จะเป็นการดีกว่าถ้าคุณมีรหัสในคำตอบของคุณ (แม้ว่ามันจะเก่าไปแล้ว) ดังนั้นมันจึงยังคงมีอยู่เมื่อลิงก์ตาย
เดินขบวน

11

ใช้server:9200/_statsเพื่อรับสถิติเกี่ยวกับนามแฝงทั้งหมดของคุณเช่นขนาดและจำนวนองค์ประกอบต่อนามแฝงซึ่งมีประโยชน์มากและให้ข้อมูลที่เป็นประโยชน์


2
แต่จากสิ่งที่ฉันจำได้ ES อนุญาตให้รับข้อมูล 16,000 ต่อคำขอเท่านั้น ดังนั้นหากข้อมูลสูงกว่า 16000 วิธีนี้จะไม่เพียงพอ
Aminah Nuraini

10

ถ้าคุณต้องการดึงหลายพันระเบียนแล้ว ... มีคนเพียงไม่กี่คนที่ให้คำตอบที่ถูกต้องในการใช้ 'scroll' (หมายเหตุ: บางคนแนะนำให้ใช้ "search_type = scan" ด้วยสิ่งนี้เลิกใช้แล้วและถูกลบใน v5.0 คุณไม่ต้องการมัน)

เริ่มต้นด้วยคำค้นหา 'ค้นหา' แต่ระบุพารามิเตอร์ 'เลื่อน' (ที่นี่ฉันใช้หมดเวลา 1 นาที):

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

ซึ่งรวมถึง 'ชุด' ครั้งแรกของการเข้าชม แต่เราไม่ได้ทำที่นี่ ผลลัพธ์ของคำสั่ง curl ด้านบนจะเป็นดังนี้:

{ "_scroll_id": "c2Nhbjs1OzUyNjE6NU4tU3BrWi1UWkNIWVNBZW43bXV3Zzs1Mzc3OkhUQ0g3VGllU2FhemJVNlM5d2t0alE7NTI2Mjo1Ti1TcGtaLVRaQ0hZU0FlbjdtdXdnOzUzNzg6SFRDSDdUaWVTYWF6YlU2Uzl3a3RqUTs1MjYzOjVOLVNwa1otVFpDSFlTQWVuN211d2c7MTt0b3RhbF9oaXRzOjIyNjAxMzU3Ow ==", "เอา": 109 "timed_out" เท็จ "_ เศษ": { "รวม": 5 "ประสบความสำเร็จ": 5 "ล้มเหลว": 0} "ฮิต" : { "รวม": 22601357 "max_score": 0.0 "ฮิต" []}}

สิ่งสำคัญคือให้มีประโยชน์ _scroll_id เหมือนกันคุณควรรันคำสั่งต่อไปนี้:

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

อย่างไรก็ตามการผ่าน scroll_id ไปรอบ ๆ นั้นไม่ใช่สิ่งที่ออกแบบมาให้ทำด้วยตนเอง ทางออกที่ดีที่สุดของคุณคือการเขียนโค้ดเพื่อทำมัน เช่นใน 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();

ตอนนี้ LOOP ในคำสั่งสุดท้ายใช้ SearchResponse เพื่อแยกข้อมูล


6

! ง่าย คุณสามารถใช้sizeและfromพารามิเตอร์!

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

จากนั้นคุณเปลี่ยนfromทีละน้อยจนกว่าคุณจะได้รับข้อมูลทั้งหมด


4
อย่าใช้วิธีนี้หากข้อมูลมีเอกสารมากมาย ... ทุกครั้งที่คุณไปที่ "หน้าถัดไป" แถบยางยืดจะช้าลงและช้าลง! ใช้ SearchAfter แทน
Joshlo

3
นอกจากนี้โซลูชันนี้จะไม่ทำงานหากขนาดข้อมูลโดยรวมสูงกว่า 10 000 ขนาดตัวเลือก = 1,000 & จาก = 1,0001 จะล้มเหลว
iclman

2
ล้มเหลวแน่นอน พารามิเตอร์from+ sizeต้องไม่มากกว่าการตั้งค่า index.max_result_window ซึ่งเป็นค่าเริ่มต้นที่ 10,000
stelios

1
หากข้อมูลมีเอกสารหลายพันฉบับคำตอบที่ถูกต้องคือใช้แบบสอบถาม 'เลื่อน'
แฮร์รี่วู้ด

ด้วยfromและsize-approach คุณจะพบกับปัญหาการแบ่งหน้าลึก ใช้ scroll API เพื่อสร้างเอกสารทั้งหมด
Daniel Schneiter

5

วิธีที่ดีที่สุดในการปรับขนาดคือใช้ size = number ที่ด้านหน้าของ URL

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

หมายเหตุ: ค่าสูงสุดที่สามารถกำหนดได้ในขนาดนี้คือ 10,000 สำหรับค่าใด ๆ ที่สูงกว่าหนึ่งหมื่นก็คาดว่าคุณจะใช้ฟังก์ชั่นเลื่อนซึ่งจะลดโอกาสของผลกระทบต่อประสิทธิภาพการทำงาน


ขนาดสูงสุดเกิดขึ้นตั้งแต่รุ่นใด?
WoodyDRN

นั่นอาจเป็นวิธีที่ "ดีที่สุด" จนถึงจุดหนึ่ง แต่ก็เป็นเรื่องที่น่าเบื่อหน่าย หากคุณมีหลายพันระเบียนวิธีที่ดีที่สุดคือแบบสอบถาม "เลื่อน"
แฮร์รี่วู้ด

ด้วยวิธีการจากและขนาดที่คุณจะพบกับปัญหาการแบ่งหน้าลึก ใช้ scroll API เพื่อสร้างเอกสารทั้งหมด
Daniel Schneiter

5

คุณสามารถใช้_countAPI เพื่อรับค่าsizeพารามิเตอร์:

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

{count:X, ...}ผลตอบแทน แยกค่า 'X' แล้วทำแบบสอบถามจริง:

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

1
การตั้งค่าขนาดเป็น X เช่นนี้อาจมีความผิดพลาดเกิดขึ้นพร้อมกันที่น่าประหลาดใจ: พิจารณาว่าเกิดอะไรขึ้นถ้ามีการเพิ่มเรคคอร์ดระหว่างการนับและการตั้งค่าขนาดในเคียวรี่ถัดไปของคุณ ... แต่ถ้าคุณมีหลายพันเรคคอร์ด แล้วมันเป็นวิธีที่ผิด คุณควรใช้แบบสอบถาม "เลื่อน" แทน
แฮร์รี่วู้ด

4

http: // localhost: 9200 / foo / _search / ? ขนาด = 1,000 & สวย = 1

คุณจะต้องระบุพารามิเตอร์ข้อความค้นหาขนาดเนื่องจากค่าเริ่มต้นคือ 10


ด้วยวิธีการจากและขนาดที่คุณจะพบกับปัญหาการแบ่งหน้าลึก ใช้ scroll API เพื่อสร้างเอกสารทั้งหมด
Daniel Schneiter

4

ขนาดพารามิเตอร์เพิ่มความนิยมที่แสดงจากค่าเริ่มต้น (10) ถึง 500

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

เปลี่ยนจากทีละขั้นตอนเพื่อรับข้อมูลทั้งหมด

http: // localhost: 9200 / [indexName] / _search size = 500 & จาก = 0

3

สำหรับ Elasticsearch 6.x

คำขอ: GET /foo/_search?pretty=true

การตอบสนอง: ใน Hits-> ยอดรวมให้นับเอกสาร

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

3

หากเป็นชุดข้อมูลขนาดเล็ก (เช่นระเบียน 1K)คุณสามารถระบุsize:

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

แข่งขันแบบสอบถามทั้งหมดไม่จำเป็นต้องเป็นมันโดยปริยาย

หากคุณมีชุดข้อมูลขนาดกลางเช่นบันทึก 1Mคุณอาจไม่ได้มีหน่วยความจำมากพอที่จะโหลดมันดังนั้นคุณจำเป็นต้องมีการเลื่อน

เลื่อนเหมือนเคอร์เซอร์ในฐานข้อมูล ใน Elasticsearch จะจดจำตำแหน่งที่คุณค้างไว้และคงมุมมองเดิมของดัชนีไว้ (เช่นป้องกันไม่ให้ผู้ค้นหาออกไปด้วยการรีเฟรชป้องกันการรวมกลุ่มจากการผสาน )

API-wise คุณต้องเพิ่มพารามิเตอร์การเลื่อนลงในคำขอแรก:

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

คุณกลับมาที่หน้าแรกและรหัสเลื่อน:

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

โปรดจำไว้ว่าทั้ง ID เลื่อนที่คุณได้รับกลับมาและหมดเวลาที่ถูกต้องสำหรับหน้าถัดไป ข้อผิดพลาดทั่วไปที่นี่คือการระบุการหมดเวลาที่มีขนาดใหญ่มาก (ค่าของscroll) ซึ่งจะครอบคลุมการประมวลผลชุดข้อมูลทั้งหมด (เช่น 1M บันทึก) แทนที่จะเป็นหนึ่งหน้า (เช่น 100 บันทึก)

หากต้องการรับหน้าถัดไปให้กรอกรหัสการเลื่อนครั้งสุดท้ายและการหมดเวลาที่ควรจะนานจนกว่าจะดึงหน้าต่อไปนี้:

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

หากคุณมีจำนวนมากที่จะส่งออก (เช่นเอกสาร 1B)คุณจะต้องขนานกัน ซึ่งสามารถทำได้ผ่านทางเลื่อนหั่นบางสมมติว่าคุณต้องการส่งออก 10 กระทู้ กระทู้แรกจะออกคำขอเช่นนี้:

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

คุณกลับมาที่หน้าแรกและรหัสเลื่อนเหมือนคำขอเลื่อนปกติ คุณจะใช้มันเหมือนกับการเลื่อนปกติยกเว้นว่าคุณจะได้รับ 1 ใน 10 ของข้อมูล

หัวข้ออื่น ๆ จะทำเช่นเดียวกันยกเว้นที่idจะเป็น 1, 2, 3 ...



2

โดยค่าเริ่มต้น Elasticsearch ส่งคืน 10 เรคคอร์ดดังนั้นควรมีการระบุขนาดอย่างชัดเจน

เพิ่มขนาดพร้อมคำขอเพื่อรับจำนวนเรคคอร์ดที่ต้องการ

http: // {host}: 9200 / {index_name} / _search? pretty = true & size = (จำนวนระเบียน)

หมายเหตุ: ขนาดหน้าสูงสุดต้องไม่เกิน index.max_result_window การตั้งค่าดัชนีซึ่งมีค่าเริ่มต้นเป็น 10,000



2

วิธีแก้ปัญหาง่ายๆโดยใช้แพ็คเกจ python elasticsearch-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)

ดูเพิ่มเติมhttps://elasticsearch-dsl.readthedocs.io/en/latest/api.html#elasticsearch_dsl.Search.scan


1

ผลลัพธ์สูงสุดซึ่งจะส่งคืนโดย elasticSearch คือ 10,000 โดยระบุขนาด

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

หลังจากนั้นคุณต้องใช้ Scroll API เพื่อรับผลลัพธ์และรับค่า _scroll_id และใส่ค่านี้ใน scroll_id

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

ควรใช้ scroll API ตั้งแต่เริ่มต้นด้วยคำขอแรกสุด
Daniel Schneiter

1

เอกสารอย่างเป็นทางการให้คำตอบสำหรับคำถามนี้! คุณสามารถค้นหาได้ที่นี่

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

คุณเพียงแค่แทนที่ขนาด (1) ด้วยจำนวนผลลัพธ์ที่คุณต้องการดู!


ผู้เขียนคำถามกำลังขอผลลัพธ์ 'ทั้งหมด' ไม่ใช่จำนวนผลลัพธ์ที่กำหนดไว้ล่วงหน้า แม้ว่าการโพสต์ลิงก์ไปยังเอกสารจะเป็นประโยชน์ แต่เอกสารไม่ได้อธิบายว่าจะทำอย่างไรให้สำเร็จและไม่ได้รับคำตอบจากคุณ
Maarten00

ด้วยวิธีการจากและขนาดคุณจะพบกับปัญหาการแบ่งหน้าลึก ใช้ scroll API เพื่อสร้างเอกสารทั้งหมด
Daniel Schneiter

0

หากต้องการส่งคืนระเบียนทั้งหมดจากดัชนีทั้งหมดคุณสามารถทำได้:

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

เอาท์พุท:

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

ในขณะที่ข้อมูลโค้ดนี้อาจแก้ไขคำถามรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพของโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ
Stamos

0

ไม่มียกเว้น @Akira Sendoh ได้ตอบวิธีรับเอกสารทั้งหมดจริง ๆ แต่ถึงกระนั้นโซลูชันดังกล่าวก็ขัดข้องบริการES 6.3ของฉันโดยไม่มีบันทึก สิ่งเดียวที่ทำงานให้ฉันโดยใช้elasticsearch-pyไลบรารีระดับต่ำคือผ่านตัวช่วยสแกนที่ใช้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

อย่างไรก็ตามวิธีที่สะอาดกว่าทุกวันนี้ดูเหมือนจะผ่านelasticsearch-dslห้องสมุดซึ่งให้การโทรที่เป็นนามธรรมและสะอาดกว่าเช่น: http://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hits


0

หากยังมีใครบางคนกำลังมองหาข้อมูลทั้งหมดที่จะดึงจาก Elasticsearch เช่นฉันสำหรับ usecases บางส่วนนี่คือสิ่งที่ฉันทำ นอกจากนี้ข้อมูลทั้งหมดหมายถึงดัชนีทั้งหมดและเอกสารทุกประเภท ฉันใช้ Elasticsearch 6.3

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

อ้างอิงการค้นหายาง


0

นี่คือแบบสอบถามเพื่อบรรลุสิ่งที่คุณต้องการ (ฉันแนะนำให้ใช้ Kibana เนื่องจากช่วยให้เข้าใจแบบสอบถามได้ดีขึ้น)

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

ในการรับบันทึกทั้งหมดที่คุณต้องใช้แบบสอบถาม "match_all"

size คือจำนวนระเบียนที่คุณต้องการดึงข้อมูล (ชนิดของข้อ จำกัด ) โดยค่าเริ่มต้น ES จะส่งคืนเฉพาะ 10 ระเบียน

จากเป็นเหมือนข้ามให้ข้าม 3 ระเบียนแรก

หากคุณต้องการเรียกระเบียนทั้งหมดให้ใช้ค่าจากฟิลด์ "รวม" จากผลลัพธ์เมื่อคุณกดคิวรีนี้จาก Kibana และใช้กับ "size"


ข้อ จำกัด ของแบบสอบถามนี้คือขนาด + จากต้องต่ำกว่าหรือเท่ากับ "index.max_result_window" สำหรับเอกสารจำนวนมาก (โดยค่าเริ่มต้น 10,000+) การค้นหานี้ไม่สามารถใช้ได้
KarelHusa

0

การใช้ Elasticsearch 7.5.1

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

ในกรณีที่คุณสามารถระบุขนาดของอาร์เรย์ด้วย & size = $ {number}

ในกรณีที่คุณไม่รู้จักคุณจัดทำดัชนี

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

0

การใช้คอนโซล kibana และ my_index เป็นดัชนีเพื่อค้นหาสิ่งต่อไปนี้สามารถมีส่วนร่วมได้ การขอให้ดัชนีคืนค่าเพียง 4 ฟิลด์ของดัชนีคุณยังสามารถเพิ่มขนาดเพื่อระบุจำนวนเอกสารที่คุณต้องการให้ส่งคืนโดยดัชนี ในฐานะของ ES 7.6 คุณควรใช้ _source แทนที่จะกรองมันจะตอบสนองได้เร็วขึ้น

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

-5

คุณสามารถใช้ size = 0 ซึ่งจะส่งคืนตัวอย่างเอกสารทั้งหมดให้คุณ

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

1
สิ่งนี้จะส่งคืนข้อมูลที่สะสม แต่ไม่ใช่จำนวนครั้งที่ถูกโจมตี
user732456
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.