답변:
나는 lucene 구문이 지원된다고 생각합니다.
http://localhost:9200/foo/_search?pretty=true&q=*:*
크기는 기본적으로 10으로 설정되므로 &size=BIGNUMBER
10 개 이상의 항목을 가져와야 할 수도 있습니다. (여기서 BIGNUMBER는 데이터 세트보다 큰 숫자라고 생각합니다)
그러나 elasticsearch 문서 는 스캔 검색 유형을 사용하여 큰 결과 세트를 제안 합니다.
EG :
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
^
size 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 http://mobz.github.io/elasticsearch-head/ 와 함께 UI 플러그인을 사용하는 것이 좋습니다 . 이렇게하면 인덱스를 더 잘 느끼고 인덱스를 테스트하는 데 도움이됩니다.
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 '
모든 색인에서 사용자 및 트윗 검색 유형
이것은 파이썬 클라이언트를 사용하여 찾은 최고의 솔루션입니다
# 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
자바 클라이언트 사용
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
5 ~ 7 회 반복 사이 에을 사용하여 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
는 후드 아래에서 스크롤을 수행하는 도우미를 구현합니다 ( 리트 버전 5.xx부터)
search_type = 'scan'
더 이상 사용되지 않습니다. 이전 문서에 잘 묻혀있는 몇 가지 흥미로운 차이점이 있지만 비슷한 코드가 없으면 작동합니다. elastic.co/guide/en/elasticsearch/reference/1.4/… 특히, search_type = scan을 사용하지 않기 위해 마이그레이션 할 때 첫 번째 '검색'쿼리는 처리 할 첫 번째 결과 배치와 함께 제공됩니다.
크기로 큰 숫자를 추가하면 Elasticsearch가 상당히 느려집니다. 모든 문서를 가져 오는 데 사용하는 한 가지 방법은 스캔 및 스크롤 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", 5 "실패": 109, "TIMED_OUT": 거짓, "_ 파편": { "총"5 "성공"을 "c2Nhbjs1OzUyNjE6NU4tU3BrWi1UWkNIWVNBZW43bXV3Zzs1Mzc3OkhUQ0g3VGllU2FhemJVNlM5d2t0alE7NTI2Mjo1Ti1TcGtaLVRaQ0hZU0FlbjdtdXdnOzUzNzg6SFRDSDdUaWVTYWF6YlU2Uzl3a3RqUTs1MjYzOjVOLVNwa1otVFpDSFlTQWVuN211d2c7MTt0b3RhbF9oaXRzOjIyNjAxMzU3Ow는 ==", "했다"0}, "히트" : { "total": 22601357, "max_score": 0.0, "hits": []}}
다음에 다음 명령을 실행해야하므로 _scroll_id를 편리하게 사용해야합니다.
curl -XGET 'localhost:9200/_search/scroll' -d'
{
"scroll" : "1m",
"scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1"
}
'
그러나 scroll_id를 전달하는 것은 수동으로 수행하도록 설계된 것이 아닙니다. 최선의 방법은 코드를 작성하는 것입니다. 예를 들어 자바에서 :
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
는 index.max_result_window 인덱스 설정을 초과 할 수 없습니다. 기본값은 10,000입니다.
from
and size
-approach를 사용하면 Deep Pagination 문제가 발생합니다. scroll API를 사용하여 모든 문서를 덤프하십시오.
크기를 조정하는 가장 좋은 방법 은 URL 앞에 size = number 를 사용하는 것 입니다.
Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty"
참고 :이 크기로 정의 할 수있는 최대 값은 10000입니다. 10,000보다 큰 값의 경우 성능에 영향을 줄 가능성을 최소화하는 스크롤 기능을 사용해야합니다.
_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 query 매개 변수를 지정해야합니다.
작은 데이터 세트 인 경우 (예 : 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
는 한 페이지 (예 : 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 ...을 제외하고 동일하게 수행됩니다 .
기본적으로 Elasticsearch는 10 개의 레코드를 반환하므로 크기를 명시 적으로 제공해야합니다.
원하는 레코드 수를 얻기 위해 요청으로 크기를 추가하십시오.
http : // {host} : 9200 / {index_name} / _search? pretty = true & size = (레코드 수)
참고 : 최대 페이지 크기는 index.max_result_window 인덱스 설정 (기본 값은 10,000)을 초과 할 수 없습니다.
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은 건너 뛰기와 같습니다. 처음 3 개의 레코드를 건너 뜁니다.
정확히 모든 레코드를 가져 오려면 Kibana에서이 쿼리에 도달 한 후 결과에서 "total"필드의 값을 사용하고 "size"와 함께 사용하십시오.
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" : {}
}
}'