web-dev-qa-db-ja.com

すべてのレコードを返すElasticsearchクエリ

私はElasticsearchに小さなデータベースを持っています、そしてテスト目的のためにすべての記録を引き戻したいです。フォームのURLを使用しようとしています...

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

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

422
John Livermore

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

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

sizeはデフォルトで10になっているので、10個以上のアイテムを取得するには&size=BIGNUMBERも必要になるかもしれません。 (BIGNUMBERは、データセットより大きいと思われる数に相当します)

しかし、elasticsearch documentation は、スキャン検索タイプを使用して、大きな結果セットに対して を提案します。

例えば:

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

それから上記のドキュメンテーションリンクに従って提案を続けてください。

編集:scan 2.1.0で廃止予定です。

scanは、_docでソートされた通常のscrollリクエストを上回るメリットを提供しません。 エラスティックドキュメントへのリンク (@ christophe-roussyが発見)

648
Steve Casey
http://127.0.0.1:9200/foo/_search/?size=1000&pretty=1
                                   ^

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

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

121
lfender6445

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プラグインを使用することをお勧めします。これにより、作成したインデックスをよりよく理解し、インデックスをテストすることができます。

30
Prerak Diwan

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

以下のクエリは、返されたいNO_OF_RESULTSを返します。

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

さて、ここでの問題はあなたが all /レコードを返されたいということです。そのため、当然のことながら、クエリを作成する前に、 NO_OF_RESULTS の値はわかりません。

あなたの文書にいくつのレコードが存在するのか、どうやって知ることができますか?下記のクエリを入力するだけです。

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

これにより、以下のような結果が得られます。

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

total は、あなたの文書で利用可能なレコード数を示しています。だから、 NO_OFの結果 の値を知るのはいい方法です。

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 '

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

22
vjpandian

これは私が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

17
Akira Sendoh

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

10
TheEnglishMe

あなたが何千ものレコードを引っ張りたいなら...少数の人々が '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}、 "ヒット" :{"合計":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を使用してデータを抽出します。

7
Somum

シンプル! sizefromパラメータを使うことができます。

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

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

7
Aminah Nuraini

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

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

注:このサイズで定義できる最大値は10000です。1万を超える値では、パフォーマンスへの影響を最小限に抑えるスクロール機能を使用することを想定しています。

6
akshay misra

Elasticsearchでは、サイズとして大きな数値を追加しただけでは significant の処理速度が遅くなります。すべての文書を取得する方法として、スキャンIDとスクロールIDを使用する方法があります。

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

6
WoodyDRN

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

デフォルトは10なので、sizeクエリパラメータを指定する必要があります。

5
Edwin Ikechukwu

sizeパラメーターの値を取得するには、 _count APIを使用します。

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

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

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

size paramは、表示されるヒット数をデフォルトの10から500に増やします。

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

from を段階的に変更して、すべてのデータを取得します。

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

Elasticsearch 6.xの場合

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

回答:Hits-> totalの中で、ドキュメントの数を数えてください。

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

Kibana DevToolsから、

GET my_index_name/_search
{
  "query": {
    "match_all": {}
  }
}
2
belostoky
curl -X GET 'localhost:9200/foo/_search?q=*&pretty' 
2
Dhruv Sharma

公式の文書がこの質問に対する答えを提供します。あなたはそれを見つけることができます ここ

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

あなたは単純にあなたが見たい結果の数でsize(1)を置き換えます!

2
christouandr7

デフォルトでElasticsearchは10レコードを返すので、サイズは明示的に提供されるべきです。

希望のレコード数を取得するために、要求に応じてサイズを追加してください。

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

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

2

それでも、私のようなユースケースでElasticsearchから取得するすべてのデータを誰かが探しているのであれば、ここで私がしたことがあります。また、すべてのデータとは、すべてのインデックスとすべてのドキュメントタイプを意味します。 Elasticsearch 6.3を使用しています

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

Elasticsearchリファレンス

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

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

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

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

sizeは取得したいレコードの数です(制限の種類)。デフォルトでは、ESは10レコードのみを返します

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

すべてのレコードを正確に取得したい場合は、Kibanaからのこのクエリにヒットしたら「total」フィールドの値を使用し、「size」を使用してください。

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
exceltior

@Akira Sendoh以外は、すべての文書を実際に取得する方法を回答していません。しかし、その解決策でさえログなしで私の ES 6.3 サービスをクラッシュさせます。私にとって低レベルのelasticsearch-pyライブラリを使用した唯一の作業は、scroll() apiを使用する scan helper を介したものです。

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
chefarov

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

0
asmaier

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" : "" 
}'
0
RAHUL JAIN