Elasticsearchに小さなデータベースがあり、テスト目的ですべてのレコードを元に戻したいと考えています。フォームのURLを使用しようとしています...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
これを実現するために使用するURLを誰かに教えてもらえますか?
Elasticsearchに小さなデータベースがあり、テスト目的ですべてのレコードを元に戻したいと考えています。フォームのURLを使用しようとしています...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
これを実現するために使用するURLを誰かに教えてもらえますか?
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" : {}
}
}'
次に、上記のドキュメントリンクが示唆するようにリクエストを続けます。
編集:scan
2.1.0で非推奨。
scan
scroll
でソートされた通常のリクエストに勝るメリットはありません_doc
。エラスティックドキュメントへのリンク(@ christophe-roussyによって発見)
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
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プラグインを使用することをお勧めします。 これにより、作成したインデックスをよりよく理解し、インデックスをテストすることができます。
注:答えは、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 '
すべてのインデックスでユーザーとツイートのタイプを検索
これは私が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
サイズとして大きな数値を追加するだけでは、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>"
}
何千ものレコードをプルしたい場合は...「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を使用してデータを抽出します。
また、すべてのエイリアスに関する統計を取得するためにも使用server:9200/_stats
します。エイリアスごとの要素のサイズや数など、これは非常に便利で、役立つ情報を提供します。
小さなデータセット(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を取得することを除いて、通常のスクロールとまったく同じように使用します。
id
1、2、3 ...になることを除いて、他のスレッドも同じことを行います。
サイズを調整する最良の方法は、URLの前にsize= numberを使用することです。
Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty"
注:このサイズで定義できる最大値は10000です。10,000を超える値の場合は、パフォーマンスへの影響の可能性を最小限に抑えるスクロール機能を使用する必要があります。
単純!使用size
してfrom
パラメータを設定できます!
http://localhost:9200/[your index name]/_search?size=1000&from=0
次に、from
すべてのデータを取得するまで徐々に変更します。
_count
APIを使用して、size
パラメーターの値を取得できます。
http://localhost:9200/foo/_count?q=<your query>
を返します{count:X, ...}
。値「X」を抽出してから、実際のクエリを実行します。
http://localhost:9200/foo/_search?q=<your query>&size=X
Kibana DevToolsから:
GET my_index_name/_search
{
"query": {
"match_all": {}
}
}
実際には本文をに渡す必要はありませんmatch_all
。次のURLへのGETリクエストを使用して行うことができます。これは最も単純な形式です。
http://localhost:9200/foo/_search
http:// localhost:9200 / foo / _search /?サイズ=1000&pretty = 1
デフォルトは10であるため、サイズクエリパラメータを指定する必要があります
size paramは、表示されるヒット数をdefault(10)から500に増やします。
http:// localhost:9200 / [indexName] / _ search?pretty = true&size = 500&q = *:*
すべてのデータを取得するには、ステップバイステップで変更します。
http:// localhost:9200 / [indexName] / _ search?size = 500&from = 0
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も参照してください。
kibana consoleとmy_indexをインデックスとして使用して、以下を検索できます。インデックスにインデックスの4つのフィールドのみを返すように要求すると、サイズを追加して、インデックスによって返されるドキュメントの数を示すこともできます。ES 7.6以降、フィルターではなく_sourceを使用すると、応答が速くなります。
GET /address/_search
{
"_source": ["streetaddress","city","state","postcode"],
"size": 100,
"query":{
"match_all":{ }
}
}
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": [
{
curl -X GET 'localhost:9200/foo/_search?q=*&pretty'
デフォルトでは、Elasticsearchは10レコードを返すため、サイズを明示的に指定する必要があります。
希望のレコード数を取得するには、リクエストでサイズを追加します。
http:// {host}:9200 / {index_name} / _ search?pretty = true&size =(レコード数)
注:最大ページサイズは、index.max_result_windowインデックス設定(デフォルトは10,000)を超えることはできません。
すべてのインデックスからすべてのレコードを返すには、次のようにします。
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,
...
サイズを指定すると、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" : ""
}'
それでも誰かが私のようなElasticsearchから取得するすべてのデータをいくつかのユースケースで探している場合は、これが私がしたことです。さらに、すべてのデータとは、すべてのインデックスとすべてのドキュメントタイプを意味します。Elasticsearch6.3を使用しています
curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}
'
公式ドキュメントはこの質問への答えを提供します!ここで見つけることができます。
{
"query": { "match_all": {} },
"size": 1
}
サイズ(1)を、見たい結果の数に置き換えるだけです。
curl -XGET '{{IP/localhost}}:9200/{{Index name}}/{{type}}/_search?scroll=10m&pretty' -d '{
"query": {
"filtered": {
"query": {
"match_all": {}
}}'
@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
これはあなたが望むことを達成するためのクエリです(クエリをよりよく理解するのに役立つので、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」で使用します。
Elasticsearch7.5.1の使用
http://${HOST}:9200/${INDEX}/_search?pretty=true&q=*:*&scroll=10m&size=5000
&size =${number}で配列のサイズを指定することもできる場合
インデックスを作成することがわからない場合
http://${HOST}:9200/_cat/indices?v
size = 0を使用できます。これにより、すべてのドキュメントの例が返されます。
curl -XGET 'localhost:9200/index/type/_search' -d '
{
size:0,
"query" : {
"match_all" : {}
}
}'