571

Elasticsearchに小さなデータベースがあり、テスト目的ですべてのレコードを元に戻したいと考えています。フォームのURLを使用しようとしています...

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

これを実現するために使用するURLを誰かに教えてもらえますか?

4

30 に答える 30

847

lucene構文はサポートされていると思います。

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

&size=BIGNUMBERサイズのデフォルトは10であるため、10個を超えるアイテムを取得する必要がある場合もあります。(BIGNUMBERは、データセットよりも大きいと思われる数値と同じです)

ただし、elasticsearchのドキュメントでは、スキャン検索タイプを使用して、大きな結果セットを提案しています。

例えば:

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

次に、上記のドキュメントリンクが示唆するようにリクエストを続けます。

編集:scan2.1.0で非推奨。

scanscrollでソートされた通常のリクエストに勝るメリットはありません_docエラスティックドキュメントへのリンク(@ christophe-roussyによって発見)

于 2012-01-12T07:28:19.287 に答える
167
http://127.0.0.1:9200/foo/_search/?size=1000&pretty=1
                                   ^

サイズパラメータに注意してください。これにより、表示されるヒット数がデフォルト(10)からシャードあたり1000に増加します。

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

于 2014-04-07T03:14:25.600 に答える
44

Elasticsearch(ES)は、ESクラスターインデックスからデータを取得するためのGETリクエストまたはPOSTリクエストの両方をサポートします。

GETを実行する場合:

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

Elasticsearch http://mobz.github.io/elasticsearch-head/でUIプラグインを使用することをお勧めします。 これにより、作成したインデックスをよりよく理解し、インデックスをテストすることができます。

于 2015-09-28T21:31:46.410 に答える
34

注:答えは、Elasticsearchの古いバージョンに関連してい0.90ます。それ以降にリリースされたバージョンでは、構文が更新されています。あなたが探している最新の答えに対するより正確な答えを提供するかもしれない他の答えを参照してください。

以下のクエリは、返されたい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_OFRESULTSの値を知るための優れた方法です。

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

すべてのインデックスですべてのタイプを検索

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

fooインデックスのすべてのタイプを検索します

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 '

すべてのインデックスでユーザーとツイートのタイプを検索

于 2014-03-19T17:02:35.463 に答える
23

これは私がPythonクライアントを使用して見つけた最良の解決策です

  # 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

于 2016-06-10T16:14:15.687 に答える
17

サイズとして大きな数値を追加するだけでは、Elasticsearchの速度が大幅に低下します。すべてのドキュメントを取得するために使用する方法の1つは、スキャンIDとスクロールIDを使用することです。

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

この結果には、次の100チャンクを取得するためにクエリする必要がある_scroll_idが含まれます。

POST /_search/scroll 
{
    "scroll" : "1m", 
    "scroll_id" : "<YOUR SCROLL ID>" 
}
于 2015-11-20T15:53:06.253 に答える
14

何千ものレコードをプルしたい場合は...「scroll」を使用することについて正しい答えを出した人もいます(注:「search_type = scan」の使用を提案した人もいます。これは非推奨であり、v5.0では削除されました。あなたはそれを必要としません)

'search'クエリから開始しますが、'scroll'パラメーターを指定します(ここでは1分のタイムアウトを使用しています)。

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

これには、ヒットの最初の「バッチ」が含まれます。しかし、ここでは完了していません。上記のcurlコマンドの出力は次のようになります。

{ "_scroll_id": "c2Nhbjs1OzUyNjE6NU4tU3BrWi1UWkNIWVNBZW43bXV3Zzs1Mzc3OkhUQ0g3VGllU2FhemJVNlM5d2t0alE7NTI2Mjo1Ti1TcGtaLVRaQ0hZU0FlbjdtdXdnOzUzNzg6SFRDSDdUaWVTYWF6YlU2Uzl3a3RqUTs1MjYzOjVOLVNwa1otVFpDSFlTQWVuN211d2c7MTt0b3RhbF9oaXRzOjIyNjAxMzU3Ow ==" は、 "取った":109、 "TIMED_OUT" 偽 "_破片":{ "合計":5、 "成功":5、 "失敗":0}、 "ヒット" :{"total":22601357、 "max_score":0.0、 "hits":[]}}

次に次のコマンドを実行する必要があるため、_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を使用してデータを抽出します。

于 2016-02-11T07:13:24.737 に答える
12

また、すべてのエイリアスに関する統計を取得するためにも使用server:9200/_statsします。エイリアスごとの要素のサイズや数など、これは非常に便利で、役立つ情報を提供します。

于 2014-08-18T13:21:16.637 に答える
12

小さなデータセット(1Kレコードなど)の場合は、次のように指定できますsize

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

暗黙的であるため、すべて一致クエリは必要ありません

1Mレコードのような中規模のデータセットがある場合、それをロードするのに十分なメモリがない可能性があるため、スクロールが必要です。

スクロールは、DB内のカーソルのようなものです。Elasticsearchでは、中断した場所を記憶し、インデックスの同じビューを維持します(つまり、サーチャーが更新で消えないようにし、セグメントがマージされないようにします)。

APIに関しては、最初のリクエストにスクロールパラメータを追加する必要があります。

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

最初のページとスクロールIDが返されます。

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

戻ってきたスクロールIDとタイムアウトの両方が次のページで有効であることを忘れないでください。ここでよくある間違いは、非常に大きなタイムアウト(の値scroll)を指定することです。これは、1ページ(たとえば100レコード)ではなく、データセット全体(たとえば1Mレコード)の処理をカバーします。

次のページを取得するには、最後のスクロールIDと、次のページを取得するまで続くタイムアウトを入力します。

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

通常のスクロールリクエストとまったく同じように、最初のページとスクロールIDが返されます。データの1/10を取得することを除いて、通常のスクロールとまったく同じように使用します。

id1、2、3 ...になることを除いて、他のスレッドも同じことを行います。

于 2020-03-06T11:01:56.607 に答える
6

サイズを調整する最良の方法は、URLの前にsize= numberを使用することです。

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

注:このサイズで定義できる最大値は10000です。10,000を超える値の場合は、パフォーマンスへの影響の可能性を最小限に抑えるスクロール機能を使用する必要があります。

于 2016-08-10T13:11:25.607 に答える
5

単純!使用sizeしてfromパラメータを設定できます!

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

次に、fromすべてのデータを取得するまで徐々に変更します。

于 2015-12-14T10:29:43.257 に答える
5

_countAPIを使用して、sizeパラメーターの値を取得できます。

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

を返します{count:X, ...}。値「X」を抽出してから、実際のクエリを実行します。

http://localhost:9200/foo/_search?q=<your query>&size=X
于 2017-06-16T21:43:07.597 に答える
5

Kibana DevToolsから:

GET my_index_name/_search
{
  "query": {
    "match_all": {}
  }
}
于 2019-02-25T07:45:05.330 に答える
5

実際には本文をに渡す必要はありませんmatch_all。次のURLへのGETリクエストを使用して行うことができます。これは最も単純な形式です。

http://localhost:9200/foo/_search

于 2021-02-19T15:13:32.403 に答える
4

http:// localhost:9200 / foo / _search /サイズ=1000&pretty = 1

デフォルトは10であるため、サイズクエリパラメータを指定する必要があります

于 2017-04-21T10:03:22.830 に答える
4

size paramは、表示されるヒット数をdefault(10)から500に増やします。

http:// localhost:9200 / [indexName] / _ search?pretty = true&size = 500&q = *:*

すべてのデータを取得するには、ステップバイステップで変更します。

http:// localhost:9200 / [indexName] / _ search?size = 500&from = 0
于 2018-01-25T08:12:01.893 に答える
4

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も参照してください。

于 2019-05-02T13:14:47.953 に答える
4

kibana consoleとmy_indexをインデックスとして使用して、以下を検索できます。インデックスにインデックスの4つのフィールドのみを返すように要求すると、サイズを追加して、インデックスによって返されるドキュメントの数を示すこともできます。ES 7.6以降、フィルターではなく_sourceを使用すると、応答が速くなります。

GET /address/_search
 {
   "_source": ["streetaddress","city","state","postcode"],
   "size": 100,
   "query":{
   "match_all":{ }
    }   
 }
于 2020-03-14T20:38:10.407 に答える
3

Elasticsearch6.xの場合

リクエスト:GET /foo/_search?pretty=true

応答:[ヒット数]-> [合計]で、ドキュメントの数を入力してください

    {
      "took": 1,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1001,
        "max_score": 1,
        "hits": [
          {
于 2018-04-24T16:13:15.353 に答える
2
curl -X GET 'localhost:9200/foo/_search?q=*&pretty' 
于 2018-05-22T09:49:20.920 に答える
2

デフォルトでは、Elasticsearchは10レコードを返すため、サイズを明示的に指定する必要があります。

希望のレコード数を取得するには、リクエストでサイズを追加します。

http:// {host}:9200 / {index_name} / _ search?pretty = true&size =(レコード数)

注:最大ページサイズは、index.max_result_windowインデックス設定(デフォルトは10,000)を超えることはできません。

于 2018-09-28T23:59:17.843 に答える
1

すべてのインデックスからすべてのレコードを返すには、次のようにします。

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,
       ...
于 2018-02-14T17:39:17.337 に答える
1

サイズを指定すると、elasticSearchによって返される最大の結果は10000です。

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" : "" 
}'
于 2018-07-24T10:59:09.997 に答える
1

それでも誰かが私のようなElasticsearchから取得するすべてのデータをいくつかのユースケースで探している場合は、これが私がしたことです。さらに、すべてのデータとは、すべてのインデックスとすべてのドキュメントタイプを意味します。Elasticsearch6.3を使用しています

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

Elasticsearchリファレンス

于 2018-08-10T06:51:26.050 に答える
1

公式ドキュメントはこの質問への答えを提供します!ここで見つけることができます。

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

サイズ(1)を、見たい結果の数に置き換えるだけです。

于 2018-12-11T10:36:39.010 に答える
0
curl -XGET '{{IP/localhost}}:9200/{{Index name}}/{{type}}/_search?scroll=10m&pretty' -d '{
"query": {
"filtered": {
"query": {
"match_all": {}
}}'
于 2018-03-27T18:39:32.463 に答える
0

@Akira Sendoh以外は、実際にすべてのドキュメントを取得する方法に回答していません。しかし、そのソリューションでさえ、ログなしでES6.3サービスをクラッシュさせます。低レベルのelasticsearch-pyライブラリを使用して私のために働いた唯一のことは、 apiを使用するスキャンヘルパーを介したものでした: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

ただし、最近のよりクリーンな方法は、elasticsearch-dslライブラリを介したもののようです。ライブラリは、より抽象的でクリーンな呼び出しを提供します。例:http ://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hits

于 2018-08-08T21:29:03.217 に答える
0

これはあなたが望むことを達成するためのクエリです(クエリをよりよく理解するのに役立つので、Kibanaを使用することをお勧めします)

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

すべてのレコードを取得するには、「match_all」クエリを使用する必要があります。

サイズは、フェッチするレコードの数(制限の種類)です。デフォルトでは、ESは10レコードのみを返します

fromはスキップのようなもので、最初の3つのレコードをスキップします。

正確にすべてのレコードをフェッチする場合は、Kibanaからこのクエリをヒットしたら、結果の「total」フィールドの値を使用し、「size」で使用します。

于 2019-06-01T15:14:38.443 に答える
0

Elasticsearch7.5.1の使用

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

&size =${number}で配列のサイズを指定することもできる場合

インデックスを作成することがわからない場合

http://${HOST}:9200/_cat/indices?v
于 2020-03-05T16:17:01.803 に答える
-5

size = 0を使用できます。これにより、すべてのドキュメントの例が返されます。

curl -XGET 'localhost:9200/index/type/_search' -d '
{
   size:0,
   "query" : {
   "match_all" : {}
    }
}'
于 2017-01-03T11:16:54.183 に答える