私はElasticsearchに小さなデータベースを持っています、そしてテスト目的のためにすべての記録を引き戻したいです。フォームのURLを使用しようとしています...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
これを実現するために使用するURLを誰かに教えてもらえますか。
私は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が発見)
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
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" : {}
}
}'
さて、ここでの問題はあなたが 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 '
すべてのインデックスで検索タイプユーザーとツイート
これは私が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
エイリアスごとの要素のサイズや数など、すべてのエイリアスに関する統計を取得するためにもserver:9200/_stats
を使用します。これは非常に便利で有用な情報を提供します。
あなたが何千ものレコードを引っ張りたいなら...少数の人々が '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を使用してデータを抽出します。
シンプル! size
とfrom
パラメータを使うことができます。
http://localhost:9200/[your index name]/_search?size=1000&from=0
その後、すべてのデータを取得するまでfrom
を徐々に変更します。
サイズを調整する最善の方法は、URLの前にsize = number を使用することです。
Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty"
注:このサイズで定義できる最大値は10000です。1万を超える値では、パフォーマンスへの影響を最小限に抑えるスクロール機能を使用することを想定しています。
Elasticsearchでは、サイズとして大きな数値を追加しただけでは significant の処理速度が遅くなります。すべての文書を取得する方法として、スキャンIDとスクロールIDを使用する方法があります。
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
http:// localhost:9200/foo/_search/ ? サイズ = 1000&pretty = 1
デフォルトは10なので、sizeクエリパラメータを指定する必要があります。
size
パラメーターの値を取得するには、 _count
APIを使用します。
http://localhost:9200/foo/_count?q=<your query>
{count:X, ...}
を返します。値 'X'を抽出してから実際のクエリを実行します。
http://localhost:9200/foo/_search?q=<your query>&size=X
size paramは、表示されるヒット数をデフォルトの10から500に増やします。
http:// localhost:9200/[indexName]/_search?pretty = true&size = 500&q = *:*
from を段階的に変更して、すべてのデータを取得します。
http:// localhost:9200/[indexName]/_search?size = 500&from = 0
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": [
{
Kibana DevToolsから、
GET my_index_name/_search
{
"query": {
"match_all": {}
}
}
curl -X GET 'localhost:9200/foo/_search?q=*&pretty'
公式の文書がこの質問に対する答えを提供します。あなたはそれを見つけることができます ここ 。
{
"query": { "match_all": {} },
"size": 1
}
あなたは単純にあなたが見たい結果の数でsize(1)を置き換えます!
デフォルトでElasticsearchは10レコードを返すので、サイズは明示的に提供されるべきです。
希望のレコード数を取得するために、要求に応じてサイズを追加してください。
http:// {Host}:9200/{index_name}/_search?pretty = true&size =(レコード数)
注:最大ページサイズはindex.max_result_windowインデックス設定(デフォルトは10,000)を超えることはできません。
それでも、私のようなユースケースでElasticsearchから取得するすべてのデータを誰かが探しているのであれば、ここで私がしたことがあります。また、すべてのデータとは、すべてのインデックスとすべてのドキュメントタイプを意味します。 Elasticsearch 6.3を使用しています
curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}
'
curl -XGET '{{IP/localhost}}:9200/{{Index name}}/{{type}}/_search?scroll=10m&pretty' -d '{
"query": {
"filtered": {
"query": {
"match_all": {}
}}'
これはあなたが望むことを達成するためのクエリです(クエリをよりよく理解するのに役立つので、私は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」を使用してください。
すべてのインデックスからすべてのレコードを返すには、次のようにします。
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,
...
@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
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 も参照してください。
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" : ""
}'