回答:
Lucene構文はサポートされていると思います。
http://localhost:9200/foo/_search?pretty=true&q=*:*
サイズのデフォルトは10なので&size=BIGNUMBER
、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
^
サイズparamに注意してください。これにより、表示されるヒットがデフォルト(10)からシャードあたり1000に増加します。
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-from-size.html
max_result_window
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とUIのプラグインを使用することをお勧めhttp://mobz.github.io/elasticsearch-head/ これはあなたが作成しても、あなたのインデックスをテスト指標のより良い感覚を得るのに役立ちます。
from
+は、size
以上のことはできませんindex.max_result_window
インデックスの設定〜10,000デフォルト
curl -XGET ... -d '{...}'
は、un
公式の混合スタイルのリクエストであることを示しています。正しいGETおよびPOST形式を表示していただきありがとうございます。
注:答えは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_OF RESULTSの値を知るための良い方法です。
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_dsl==5.4.0
していて、それなしで動作しsearch_type = 'scan',
ます。
size=10000
回の反復のどこかで、110kのドキュメントをでスクロールしようとします。でstatus=127
、main ERROR Null object returned for RollingFile in Appenders
、main ERROR Unable to locate appender "rolling" for logger config "root"
いいえにログインする/var/log/elasticsearch/elasticsearch.log
scan
(LEATのバージョン5.XX以降)ボンネットの下にスクロールを行いhelpers`
search_type = 'scan'
廃止予定です。同様のコードはそれなしでも機能しますが、古いドキュメントにはよく埋もれている興味深い違いがあります。elastic.co/guide/en/elasticsearch/reference/1.4/… 特に、search_type = scanを使用しないように移行する場合、最初の「検索」クエリには、処理する結果の最初のバッチが含まれます。
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>"
}
search_type=scan
は非推奨になりました。したがって、それを削除する必要がありますが、動作が少し変更されました。データの最初のバッチは、最初の検索呼び出しから返されます。あなたが提供するリンクはそれを行う正しい方法を示しています。
server:9200/_stats
すべてのエイリアスに関する統計情報を取得するためにも使用します。エイリアスごとの要素のサイズや数など、これは非常に便利であり、役立つ情報を提供します
何千ものレコードをプルしたい場合...数人が「スクロール」を使用する正しい答えを出しました(注:「search_type = scan」の使用を提案する人もいます。これは非推奨で、v5.0では削除されました。あなたはそれを必要としません)
「検索」クエリから始めますが、「スクロール」パラメータを指定します(ここでは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
すべてのデータを取得するまで徐々に変更します。
from
+ size
は、デフォルトで10,000に設定されているindex.max_result_windowインデックス設定を超えることはできません
from
and size
アプローチを使用すると、Deep Paginationの問題が発生します。スクロールAPIを使用して、すべてのドキュメントのダンプを作成します。
サイズを調整する最良の方法は、URLの前にsize = numberを使用することです
Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty"
注:このサイズで定義できる最大値は10000です。1万を超える値の場合、パフォーマンスへの影響の可能性を最小限に抑えるスクロール機能を使用することを想定しています。
_count
APIを使用して、size
パラメーターの値を取得できます。
http://localhost:9200/foo/_count?q=<your query>
を返します{count:X, ...}
。値「X」を抽出してから、実際のクエリを実行します。
http://localhost:9200/foo/_search?q=<your query>&size=X
http:// localhost:9200 / foo / _search /?サイズ = 1000&pretty = 1
デフォルトは10であるため、サイズクエリパラメータを指定する必要があります。
sizeパラメータは、表示されるヒットをdefault(10)から500に増やします。
http:// localhost:9200 / [indexName] / _search?pretty = true&size = 500&q = *:*
を段階的に変更してすべてのデータを取得します。
http:// localhost:9200 / [indexName] / _search?size = 500&from = 0
小さなデータセット(例: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レコード)ではなく、データセット全体(たとえば100万レコード)の処理をカバーする非常に大きなタイムアウト(値)を指定することです。
次のページを取得するには、最後のスクロール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 ...
デフォルトでは、Elasticsearchは10レコードを返すため、サイズを明示的に指定する必要があります。
希望のレコード数を取得するには、リクエストにサイズを追加します。
http:// {host}:9200 / {index_name} / _search?pretty = true&size =(レコード数)
注:最大ページサイズは、デフォルトで10,000に設定されているindex.max_result_windowインデックス設定を超えることはできません。
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" : ""
}'
公式ドキュメントはこの質問に対する答えを提供します!あなたはそれをここで見つけることができます。
{
"query": { "match_all": {} },
"size": 1
}
サイズ(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,
...
@Akira Sendoh以外はどれも実際にすべてのドキュメントを取得する方法に答えていません。しかし、そのソリューションでも、ログなしでES 6.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
それでも誰かが私のようなElasticsearchから取得するすべてのデータをいくつかのユースケースで探しているなら、これが私がやったことです。さらに、すべてのデータは、すべてのインデックスとすべてのドキュメントタイプを意味します。Elasticsearch 6.3を使用しています
curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
"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はskipのようなもので、最初の3レコードをスキップします。
正確にすべてのレコードをフェッチしたい場合は、Kibanaからこのクエリをヒットして「size」で使用したら、結果の「total」フィールドの値を使用します。
kibana consoleとmy_indexをインデックスとして使用して、以下を検索できます。インデックスにインデックスの4つのフィールドのみを返すように要求する場合は、サイズを追加して、インデックスによって返されるドキュメントの数を指定することもできます。ES 7.6以降では、より速く応答するように、フィルターではなく_sourceを使用する必要があります。
GET /address/_search
{
"_source": ["streetaddress","city","state","postcode"],
"size": 100,
"query":{
"match_all":{ }
}
}
size = 0を使用すると、すべてのドキュメントの例が返されます
curl -XGET 'localhost:9200/index/type/_search' -d '
{
size:0,
"query" : {
"match_all" : {}
}
}'