Tüm kayıtları döndürmek için Elasticsearch sorgusu


490

Elasticsearch küçük bir veritabanı var ve test amacıyla tüm kayıtları geri çekmek istiyorum. Formun URL'sini kullanmaya çalışıyorum ...

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

Birisi bana bunu gerçekleştirmek için kullanacağınız URL'yi verebilir mi lütfen?


1
... burada "foo", tüm kayıtları göstermek istediğiniz dizinin adıdır.
jonatan

Yanıtlar:


744

Bence lucene sözdizimi şu şekilde desteklenmektedir:

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

boyut varsayılan olarak 10'dur, bu nedenle &size=BIGNUMBER10'dan fazla öğe almanız gerekebilir . (burada BIGNUMBER, veri kümenizden daha büyük olduğuna inandığınız bir sayıya eşittir)

AMA, elasticsearch belgeleri tarama arama türünü kullanarak büyük sonuç kümeleri için önerilerde bulunur .

ÖRNEĞİN:

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

ve daha sonra yukarıdaki dokümantasyon bağlantısına göre talepte bulunmaya devam edin.

EDIT: scan2.1.0'da kullanımdan kaldırıldı.

scanscrolltarafından sıralanan normal bir istek üzerine herhangi bir fayda sağlamaz _doc. elastik dokümanlara bağlantı (@ christophe-roussy tarafından tespit edildi)


6
Teşekkürler. Bu, şu an için ihtiyacım olan şeyleri döndüren son şeydi ... localhost: 9200 / foo / _search? Size = 50 & pretty = true & q = *: *
John Livermore

2
@ Steve'in cevabına ek olarak, elasticsearch'ün anladığı parametrelerin bir listesini bu bağlantıda bulabilirsiniz elasticsearch.org/guide/reference/api/search/uri-request
Karthick

1
Cevabınız için @Steve teşekkürler. Yeni bir soru için yeterince önemli olduğunu düşünmemiştim. Açıkça herhangi bir yerde ifade edilmedi, bu yüzden burada sadece doğrulamak isteyeceğimizi düşündüm.
Churro

8
Gerçekten tarama + kaydırma isteklerini kullanmalısınız. Size = BIGNUMBER kullanırsanız, Lucene'in bu sayı için skorlar için bellek ayırdığını unutmayın, bu yüzden aşırı büyük yapmayın. :)
Alex Brasetvik


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

Boyut parametresini not edinShard başına varsayılandan (10) görüntülenen isabet sayısını artıran .

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


10
Akılda tutulması gereken bir şey (Elasticsearch belgelerinden): + boyutundan varsayılan olarak 10.000'e ayarlanan index.max_result_window dizin ayarından daha fazla olamaz.
user3078523

2
Bu 1000 döndürür, hepsi değil, user3078523 doğru, bu yöntemin bir sınırı vardırmax_result_window
stelios

1
Bir maksimuma sahiptir ve ayrıca (eğer elde edilecek binlerce kayıt varsa) bu maksimuma çıkmak için oldukça ağır bir yaklaşımdır. Bunun yerine bir "kaydırma" sorgusu kullanmalısınız.
Harry Wood

37

elasticsearch (ES), ES küme dizininden veri almak için hem bir GET'i hem de bir POST isteğini destekler.

Bir GET yaptığımızda:

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

Bir POST yaptığımızda:

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

Elasticsearch ile bir UI eklentisi kullanmanızı öneririm http://mobz.github.io/elasticsearch-head/ Bu, oluşturduğunuz endeksleri daha iyi hissetmenize ve endekslerinizi test etmenize yardımcı olacaktır.


3
Başka bir kullanıcının belirttiği gibi: from+ varsayılan olarak 10.000sizeindex.max_result_window
stelios

Bu yaklaşımın bir maksimum değeri vardır ve ayrıca (almak için binlerce kaydınız varsa), bu maksimum değere ulaşmak oldukça ağır bir yaklaşımdır. Bunun yerine bir "kaydırma" sorgusu kullanmalısınız
Harry Wood

Gariptir ki, resmi dokümanlar curl -XGET ... -d '{...}', unresmi bir karışık talep tarzıdır. Doğru GET ve POST biçimlerini gösterdiğiniz için teşekkür ederiz.
Jesse Chisholm

28

Not: Yanıt, Elasticsearch'ün daha eski bir sürümüyle ilgilidir 0.90. O zamandan beri yayınlanan sürümlerin güncellenmiş bir sözdizimi vardır. Lütfen aradığınız en son cevaba daha doğru cevap verebilecek diğer cevaplara bakınız.

Aşağıdaki sorgu, döndürülmesini istediğiniz NO_OF_RESULTS değerini döndürecektir.

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

Şimdi buradaki soru, tüm kayıtların geri gönderilmesini istemenizdir . Doğal olarak, bir sorgu yazmadan önce NO_OF_RESULTS değerini bilmeyeceksiniz .

Belgenizde kaç kayıt olduğunu nasıl biliyoruz? Sorguyu aşağıya yazmanız yeterlidir

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

Bu size aşağıdakine benzer bir sonuç verecektir.

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

Sonuç toplamı belgenizde kaç kayıt olduğunu gösterir. Yani, NO_OF SONUÇLARININ değerini bilmenin güzel bir yolu

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

Tüm endekslerdeki tüm türleri arayın

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

Foo dizinindeki tüm türleri ara

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

Foo1 ve foo2 endekslerindeki tüm türleri arayın

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

F ile başlayan herhangi bir endekste tüm tipleri ara

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

Tüm dizinlerde arama türleri kullanıcı ve tweet


9
Temel sorguya bir boyut parametresi dahil edilmedikçe ES varsayılan olarak 10 sonuç döndürür.
lfender6445

Önceki yanıt üç yaşındaydı. Geçerli bir sürümle güncellendi.
vjpandian

19

Bu, python istemcisini kullanarak bulduğum en iyi çözüm

  # 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 istemcisini kullanma

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


Teşekkürler Mark, tam da aradığım şey buydu! Benim durumumda (ELK 6.2.1, piton 3) olarak, arama_türü argümanı geçerli değildi ve document_type artık beri ELK 6.0 gerekli değildir
Christoph Schranz

Mükemmel çözüm! Teşekkürler. Kullanıyordum elasticsearch_dsl==5.4.0ve olmadan çalışıyor search_type = 'scan',.
Usman Maqbool

ES 6.3. Bu örnek, Elasticsearch hizmetimin size=100005-7 yineleme arasında bir yerde 110 bin belge kaydırmaya çalışarak çökmesini sağlıyor . ile status=127, main ERROR Null object returned for RollingFile in Appenders, main ERROR Unable to locate appender "rolling" for logger config "root"No günlükleri/var/log/elasticsearch/elasticsearch.log
stelios

Kayıt için, python istemcileri scankaputun altında kaydırma yapan bir yardımcılar uygular ( lxx'de 5.xx sürümünden beri)
MCMZL 15:08

search_type = 'scan'kullanımdan kaldırıldı. Eski belgelerde iyi gömülmüş bazı ilginç farklılıklar olmasına rağmen, benzer kod bu olmadan çalışacaktır. elastic.co/guide/en/elasticsearch/reference/1.4/... ilk 'ara' sorgu sürecine sonuçlarının ilk parti gelecek, arama_türü = tarama kullanmayın geçiş yaparken, özellikle.
Harry Wood

12

Yalnızca boyut olarak büyük bir sayı eklerseniz Elasticsearch önemli ölçüde yavaşlar, tüm belgeleri almak için kullanılacak yöntemlerden biri tarama ve kaydırma kimliklerini kullanmaktır.

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

Elasticsearch v7.2'de bunu şöyle yapabilirsiniz:

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

Bunun sonuçları, sonraki 100 parçayı almak için sorgulamanız gereken bir _scroll_id içerir.

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

1
Bu yanıt için daha fazla güncelleme gerekiyor. search_type=scanartık kullanımdan kaldırıldı. Yani bunu kaldırmalısınız, ama sonra davranış biraz değişti. İlk veri grubu ilk arama çağrısından gelir. Sağladığınız bağlantı, bunu yapmanın doğru yolunu gösteriyor.
Harry Wood

1
Yorumum gerçekten çok daha yavaş olacağı için boyut olarak herhangi bir sayı ekleyemeyeceğinizi belirtmekti. Bu yüzden kod örneğini kaldırdım ve insanlar doğru kodu almak için bağlantıyı takip edebilir.
WoodyDRN

1
@WoodyDRN Kodun cevabınızda olması daha iyidir (eskimiş olsa bile), bu yüzden bağlantı sona erdiğinde hala kullanılabilir.
Trisped

11

server:9200/_statsdiğer takma adlarınızla ilgili istatistikleri almak için de kullanın .. takma ad başına öğe sayısı ve sayısı gibi, bu çok yararlı ve yararlı bilgiler sağlar


2
Ancak, hatırladığım kadarıyla, ES sadece istek başına 16000 veri almaya izin verir. Veriler 16000'in üzerindeyse, bu çözüm yeterli değildir.
Aminah Nuraini

10

Binlerce kayıt almak istiyorsanız ... birkaç kişi 'scroll' komutunu kullanmak için doğru cevabı verdi (Not: Bazı kişiler "search_type = scan" kullanılmasını önerdi. İhtiyacınız yok)

Bir 'arama' sorgusu ile başlayın, ancak bir 'kaydırma' parametresi belirtin (burada 1 dakikalık zaman aşımı kullanıyorum):

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

Bu, ilk isabet grubunuzu içerir. Ama burada işimiz bitmedi. Yukarıdaki kıvırma komutunun çıktısı şöyle olacaktır:

{ "_Scroll_id":, 5 "başarısız": 109, "timed_out": false, "_ kırıkları": { "toplam": 5, "başarılı" "c2Nhbjs1OzUyNjE6NU4tU3BrWi1UWkNIWVNBZW43bXV3Zzs1Mzc3OkhUQ0g3VGllU2FhemJVNlM5d2t0alE7NTI2Mjo1Ti1TcGtaLVRaQ0hZU0FlbjdtdXdnOzUzNzg6SFRDSDdUaWVTYWF6YlU2Uzl3a3RqUTs1MjYzOjVOLVNwa1otVFpDSFlTQWVuN211d2c7MTt0b3RhbF9oaXRzOjIyNjAxMzU3Ow ==", "aldı" 0}, "hit" : { "toplam": 22601357, "max_score": 0.0, "hit" []}}

Aşağıdaki komutu çalıştırmanız gerektiğinden _scroll_id'in kullanışlı olması önemlidir:

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

Ancak, scroll_id öğesinin iletilmesi, elle yapılması için tasarlanmış bir şey değildir. Yapabileceğiniz en iyi şey, bunu yapmak için kod yazmaktır. örneğin, 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();

Şimdi son komutta LOOP veri ayıklamak için SearchResponse kullanın.


6

Basit! sizeVe fromparametrelerini kullanabilirsiniz !

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

sonra fromtüm verileri elde edene kadar aşamalı olarak değiştirirsiniz .


4
veriler çok fazla belge içeriyorsa asla bu yöntemi kullanmayın ... "Bir sonraki sayfaya" her gittiğinizde Elastik daha yavaş ve daha yavaş olacaktır! Bunun yerine SearchAfter'ı kullanın
Joshlo

3
Ayrıca, toplam veri boyutu 10 000'in üzerindeyse bu çözüm çalışmaz. = 1000 & from = 10001 seçenek boyutu başarısız olur.
iclman

2
Gerçekten başarısız olur. Parametreler from+ size, index.max_result_window dizin ayarından fazla olamaz ve varsayılan olarak 10.000
stelios

1
Veriler binlerce belge içeriyorsa, doğru cevap bir 'kaydırma' sorgusu kullanmaktır.
Harry Wood

İle fromve size-approach Derin Sayfalandırmayı problem haline çalışacaktır. Tüm belgelerin dökümünü almak için kaydırma API'sını kullanın.
Daniel Schneiter

5

Boyutu ayarlamanın en iyi yolu , URL'nin önünde size = sayı kullanmaktır

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

Not: Bu boyutta tanımlanabilecek maksimum değer 10000'dir. On binin üzerindeki herhangi bir değer için, performans üzerindeki herhangi bir etki olasılığını en aza indirecek kaydırma işlevini kullanmanızı bekler.


Hangi versiyondan beri maksimum boyut oluşur?
WoodyDRN

Bu bir noktaya kadar "en iyi" yol olabilir, ama gerçekten biraz noddy. Binlerce kaydınız varsa, en iyi yol bir "kaydırma" sorgusudur.
Harry Wood

Başlangıç ​​ve boyut yaklaşımı ile Derin Sayfalama problemine gireceksiniz. Tüm belgelerin dökümünü almak için kaydırma API'sını kullanın.
Daniel Schneiter

5

Parametrenin _countdeğerini almak için API'yı kullanabilirsiniz size:

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

İade {count:X, ...}. 'X' değerini ayıklayın ve asıl sorguyu yapın:

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

1
Boyutu bu şekilde X olarak ayarlamak şaşırtıcı bir eşzamanlılık aksaklığına sahip olabilir: Sayımı yapmak ve bir sonraki sorgunuzda boyutu ayarlamak arasında bir kayıt eklenirse ne olacağını düşünün ... , o zaman yanlış yaklaşım. Bunun yerine bir "kaydırma" sorgusu kullanmalısınız.
Harry Wood


4

size param görüntülenen isabetleri varsayılandan (10) 500'e yükseltir.

http: // localhost: 9200 / [indexname] / _search oldukça = true & size = 500 & q = *: *

Change gelen tüm verileri almak için adım adım.

http: // localhost: 9200 / [indexname] / _search boyutu = 500 = 0'dan

3

Elasticsearch 6.x için

İstek: GET /foo/_search?pretty=true

Yanıt: Sonuç sayısı> toplamda, doküman sayısını verin

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

3

Küçük bir veri kümesiyse (örneğin, 1K kayıtları) , şunları belirtebilirsiniz size:

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

Maç tüm sorgu o örtülü olduğu gibi, gerekli değildir.

1M kayıtları gibi orta boyutlu bir veri kümeniz varsa varsa, onu yüklemek için yeterli belleğiniz olmayabilir, bu nedenle kaydırma yapmanız gerekir .

Kaydırma, DB'deki imleç gibidir. Elasticsearch'te, kaldığınız yeri hatırlar ve dizinin aynı görünümünü korur (yani, arama yapan kişinin bir yenilemeyle gitmesini önler, segmentlerin birleşmesini önler ).

API olarak, ilk isteğe bir kaydırma parametresi eklemeniz gerekir:

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

İlk sayfayı ve kaydırma kimliğini geri alırsınız:

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

Bunu hatırla geri almak kaydırma kimliği ve zaman aşımı hem sonraki sayfada geçerlidir . Buradaki yaygın bir hata, çok büyük bir zaman aşımı (scroll , tek bir sayfa (örneğin 100 kayıt) yerine tüm veri kümesini (örn. 1M kayıtları) işlemeyi kapsayacak ) .

Sonraki sayfayı almak için, son kaydırma kimliğini ve aşağıdaki sayfayı getirene kadar sürmesi gereken bir zaman aşımını girin:

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

Dışa aktarılacak çok şeyiniz varsa (örneğin 1B belgeleri) , paralel hale getirmek istersiniz. Bu dilimli kaydırma ile yapılabilir . 10 iş parçacığına dışa aktarmak istediğinizi varsayalım. İlk iş parçacığı aşağıdaki gibi bir istek gönderir:

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

İlk sayfayı ve kaydırma kimliğini, normal bir kaydırma isteği gibi geri alırsınız. Verilerin 1 / 10'unu almanız dışında, normal bir kaydırma gibi kullanırsınız.

Diğer dişler de aynısını yapar, ancak id1, 2, 3 ...



2

Elasticsearch varsayılan olarak 10 kayıt döndürür, böylece boyut açıkça belirtilmelidir.

İstediğiniz kayıt sayısını almak için istek ile boyut ekleyin.

http: // {host}: 9200 / {index_name} / _search? pretty = true & size = (kayıt sayısı)

Not: Maks. Sayfa boyutu varsayılan olarak 10.000 olan index.max_result_window dizin ayarından fazla olamaz.


2

Kibana DevTools'tan:

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

2

Elasticsearch-dsl python paketini kullanarak basit bir çözüm :

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)

Ayrıca bkz . Https://elasticsearch-dsl.readthedocs.io/en/latest/api.html#elasticsearch_dsl.Search.scan .


1

ElastikArama ile döndürülecek maksimum sonuç, boyut sağlayarak 10000'dir

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

Bundan sonra, sonucu elde etmek ve _scroll_id değerini almak ve bu değeri scroll_id'e koymak için Scroll API'sını kullanmanız gerekir.

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

Scroll API, ilk istekle en baştan kullanılmalıdır.
Daniel Schneiter

1

Resmi belgeler bu sorunun cevabını verir! burada bulabilirsiniz .

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

Boyutu (1) basitçe görmek istediğiniz sonuç sayısı ile değiştirirsiniz!


Sorunun yazarı önceden belirlenmiş miktarda sonuç değil, 'tüm' sonuçlar istiyordu. Dokümanlara bir bağlantı yayınlamak yararlı olsa da dokümanlar buna nasıl ulaşılacağını açıklamaz, yanıtı da yanıtlamaz.
Maarten00

Başlangıç ​​ve boyut yaklaşımı ile Derin Sayfalama problemine gireceksiniz. Tüm belgelerin dökümünü almak için kaydırma API'sını kullanın.
Daniel Schneiter

0

Tüm dizinlerdeki tüm kayıtları döndürmek için şunları yapabilirsiniz:

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

Çıktı:

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

Bu kod snippet'i soruyu çözebilir, ancak bir açıklama dahil olmak , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
Stamos

0

@Akira Sendoh dışında hiçbiri TÜM dokümanları nasıl alacağınızı cevaplamadı. Ancak bu çözüm bile ES 6.3 hizmetimi günlükler olmadan çöküyor . Alt düzey elasticsearch-pykitaplığı kullanarak benim için çalışan tek şey api kullanan tarama yardımcısıydıscroll() :

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

Bununla birlikte, günümüzde daha temiz bir yol elasticsearch-dsl, daha soyut, daha temiz çağrılar sunan kütüphane aracılığıyla görünmektedir , örneğin: http://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hits


0

Hala birisi bazı kullanımlar için benim gibi Elasticsearch'ten alınacak tüm verileri arıyorsa, işte yaptığım şey. Ayrıca, tüm veriler, tüm indeksler ve tüm belge türleri anlamına gelir. Elasticsearch 6.3 kullanıyorum

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

Elasticsearch referansı


0

Bu, ne istediğinizi başarmak için sorgu (Sorguları daha iyi anlamaya yardımcı olduğu için Kibana kullanmanızı öneririm)

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

tüm kayıtları almak için "match_all" sorgusunu kullanmalısınız.

boyut, getirmek istediğiniz kayıtların sayısıdır (bir tür sınırlama). varsayılan olarak ES yalnızca 10 kayıt döndürür

from gibi atla, ilk 3 kaydı atla.

Tam olarak tüm kayıtları almak istiyorsanız, Kibana'dan bu sorguyu vurduktan ve "boyut" ile kullandıktan sonra, sonuçtan "toplam" alanındaki değeri kullanın.


Bu sorgunun sınırlaması, boyutundan itibaren "index.max_result_window" ile aynı veya daha küçük olması gerektiğidir. Çok sayıda belge için (varsayılan olarak 10000+) bu sorgu uygulanamaz.
KarelHusa

0

Elasticsearch'ü Kullanma 7.5.1

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

dizinizin boyutunu & size = $ {number} ile de belirtebilirsiniz.

endeksini bilmiyorsan

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

0

Aşağıdakileri aramak için dizin olarak kibana konsolu ve my_index kullanmak katkıda bulunabilir. Dizinden dizinin yalnızca 4 alanını döndürmesini istemekle birlikte, dizin tarafından döndürülmesini istediğiniz belgeyi belirtmek için boyut da ekleyebilirsiniz. ES 7.6'dan itibaren filtre yerine _source kullanmalısınız, daha hızlı yanıt verecektir.

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

-5

Size = 0 kullanabilirsiniz, bu size tüm belgeler örneğini döndürecektir

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

1
Bu, biriken bilgileri döndürür, ancak isabetlerin kendisini
döndürmez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.