모든 레코드를 반환하는 탄력적 검색 쿼리
저는 Elasticsearch에 작은 데이터베이스를 가지고 있으며 테스트 목적으로 모든 레코드를 다시 가져오려고 합니다.양식의 URL을 사용하려고 합니다...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
누가 당신이 이것을 수행하는데 사용할 URL을 나에게 줄 수 있습니까?
lucene 구문이 지원된다고 생각합니다.
http://localhost:9200/foo/_search?pretty=true&q=*:*
인 10 이므로가 도 있습니다.&size=BIGNUMBER
10개 이상의 아이템을 얻을 수 있습니다.(여기서 빅넘버는 데이터셋보다 크다고 생각되는 숫자와 같습니다.)
그러나 탄력적 검색 문서에서는 검색 유형을 사용하여 큰 결과 집합에 대해 제안합니다.
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-rousy spotted)
http://127.0.0.1:9200/foo/_search/?size=1000&pretty=1
^
기본값(10)에서 샤드당 1000으로 표시되는 히트 수를 증가시키는 size param을 기록합니다.
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-from-size.html
ES(elastic search)는 ES 클러스터 인덱스에서 데이터를 가져오는 GET 또는 POST 요청을 모두 지원합니다.
GET을 수행할 때:
http://localhost:9200/[your index name]/_search?size=[no of records you want]&q=*:*
게시할 때:
http://localhost:9200/[your_index_name]/_search
{
"size": [your value] //default 10
"from": [your start index] //default 0
"query":
{
"match_all": {}
}
}
http://mobz.github.io/elasticsearch-head/ 탄력 검색 기능이 있는 UI 플러그인을 사용하는 것을 추천합니다. 이렇게 하면 생성한 인덱스를 더 잘 파악할 수 있고 인덱스를 테스트하는 데 도움이 됩니다.
참고: 답변은 이전 버전의 Elasticsearch와 관련이 있습니다.
0.90
그 을 가지고 그 이후 출시된 버전들은 업데이트된 구문을 가지고 있습니다.최근에 찾고 있는 답변에 대해 보다 정확한 답변을 제공할 수 있는 다른 답변을 참고하시기 바랍니다.
아래 쿼리는 반환하고자 하는 NO_OF_RESULT를 반환합니다.
curl -XGET 'localhost:9200/foo/_search?size=NO_OF_RESULTS' -d '
{
"query" : {
"match_all" : {}
}
}'
자, 여기서 문제는 모든 기록을 반환하라는 것입니다.따라서 당연히 쿼리를 작성하기 전에 NO_OF_RESULT의 값을 알 수 없습니다.
귀하의 문서에 얼마나 많은 기록이 존재하는지 어떻게 알 수 있습니까?아래에 쿼리를 입력하기만 하면 됩니다.
curl -XGET 'localhost:9200/foo/_search' -d '
이것은 당신에게 아래와 같은 결과를 줄 것입니다.
{
hits" : {
"total" : 2357,
"hits" : [
{
..................
결과 합계는 문서에서 사용 가능한 레코드 수를 알려줍니다.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 client를 사용하여 찾은 최고의 솔루션입니다.
# 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
작은 데이터 세트(예: 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
하나, 둘, 셋...
수천 개의 기록을 남기고 싶다면...몇몇 사람들은 'scroll'를 사용하는 것에 대해 정답을 제시했습니다(참고: 일부 사람들은 'search_type=scan'을 사용할 것을 제안하기도 했습니다.이 버전은 더 이상 사용되지 않으며 v5.0에서는 제거되었습니다.필요 없습니다.)
먼저 '검색' 쿼리로 시작하되 '스크롤' 매개변수를 지정합니다(여기서는 1분 타임아웃을 사용합니다).
curl -XGET 'http://ip1:9200/myindex/_search?scroll=1m' -d '
{
"query": {
"match_all" : {}
}
}
'
그것은 당신의 첫번째 히트곡들을 포함합니다.하지만 우리는 여기서 끝나지 않았습니다.위 curl 명령의 출력은 다음과 같습니다.
{"_scroll_id":"c2Nhbjs1OzUyNjE6NU4tU3BrWi1UWKNIWVNBZW43bX3Zzs1Mzc3OkhUQ0g3VGllU2FhemJVNlM5d2t0alE7NTI2Mjo1Ti1TcGtaLVRaQ0hZU0FlbjdtdXdnOzNzg6SFRDSDDUaWVTYWF6YlU2Uzl3a3RqUTS1MjYzOjVOLVNwa1otVFpDSFlTQWVuN211d2c7MTt0b3RhbF9oaXRzOjIyNjAxMzU3Ow==",take":109,timeed_out":false,_shards":{"total":5", successful":5", failed":0}, hits":{"총":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를 사용하여 데이터를 추출합니다.
크기만큼 큰 숫자만 추가하면 탄력적인 검색이 현저히 느려집니다. 모든 문서를 가져오기 위해 사용하는 한 가지 방법은 스캔 및 스크롤 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>"
}
사용하다server:9200/_stats
당신의 모든 가명에 대한 통계를 얻기 위해..합니다를
당신은 사실 한 사람의 시체를 그에게 넘겨줄 필요가 없습니다.match_all
URL 로 GET 를 합니다.이것이 가장 간단한 형태입니다.
http://localhost:9200/foo/_search
크기를 조절하는 가장 좋은 방법은 URL 앞에 size= number를 사용하는 것입니다.
Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty"
참고: 이 크기에서 정의할 수 있는 최대값은 10000입니다.10,000 이상의 값에 대해서는 성능에 영향을 미칠 가능성을 최소화하는 스크롤 기능을 사용할 것으로 예상됩니다.
API를 사용하여 에 대한 값을 얻을 수 있습니다.size
매개 변수:
http://localhost:9200/foo/_count?q=<your query>
{count:X, ...}
를 값 'X'를 추출한 다음 실제 쿼리를 수행합니다.
http://localhost:9200/foo/_search?q=<your query>&size=X
! 합니다를 할 수 .size
그리고.from
매개변수!
http://localhost:9200/[your index name]/_search?size=1000&from=0
.from
모든 데이터를 얻을 때까지 점차적으로.
Kibana DevTools에서 다음 내용을 제공합니다.
GET my_index_name/_search
{
"query": {
"match_all": {}
}
}
http://localhost:9200/foo/_search/?size=1000&pretty=1
기본값이 10이므로 크기 쿼리 매개 변수를 지정해야 합니다.
size param은 표시되는 히트 수를 기본값(10)에서 500으로 늘립니다.
http://localhost:9200/[indexName]/_search?pretty=true&size=500&q=*:*
단계별로 을 변경하여 모든 데이터를 가져옵니다.
http://localhost:9200/[indexName]/_search?size=500&from=0
python 패키지 elastic search-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":{ }
}
}
Elastic 검색 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": [
{
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에서 검색할 모든 데이터를 찾고 있다면, 여기 내가 한 일이 있습니다.또한 모든 데이터 수단, 모든 인덱스 및 모든 문서 유형.Elasticsearch 6.3을 사용하고 있습니다.
curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}
'
공식 문서는 이 질문에 대한 답을 제공합니다!여기서 찾을 수 있습니다.
{
"query": { "match_all": {} },
"size": 1
}
크기(1)를 보기 원하는 결과 수로 바꾸기만 하면 됩니다!
원하는 것을 달성하기 위한 쿼리입니다. (쿼리를 더 잘 이해하는 데 도움이 되기 때문에 Kibana를 사용하는 것을 제안합니다.
GET my_index_name/my_type_name/_search
{
"query":{
"match_all":{}
},
size : 20,
from : 3
}
모든 레코드를 얻으려면 "match_all" 쿼리를 사용해야 합니다.
size는 가져올 레코드의 개수입니다(한계의 종류).기본적으로 ES는 10개의 레코드만 반환합니다.
처음 3개의 레코드를 건너뛰는 것과 같습니다.
정확하게 모든 레코드를 가져오려면 키바나에서 이 쿼리를 치면 결과의 "total" 필드의 값을 사용하고 "size"와 함께 사용하면 됩니다.
curl -XGET '{{IP/localhost}}:9200/{{Index name}}/{{type}}/_search?scroll=10m&pretty' -d '{
"query": {
"filtered": {
"query": {
"match_all": {}
}}'
@Akira Sendoh를 제외하고는 아무도 모든 문서를 실제로 얻는 방법에 대해 대답하지 않았습니다.하지만 그 솔루션조차도 로그 없이 ES 6.3 서비스를 중단시킵니다.낮은 레벨을 사용하는 것이 나에게 유일하게 도움이 된 것은elasticsearch-py
라이브러리는 다음을 사용하는 스캔 도우미를 통해 사용되었습니다.scroll()
api:
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 7.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" : {}
}
}'
언급URL : https://stackoverflow.com/questions/8829468/elasticsearch-query-to-return-all-records
'programing' 카테고리의 다른 글
$location으로 AngularJS url 변경 (0) | 2023.09.23 |
---|---|
C#에서 XSLT 스타일시트를 적용하는 방법 (0) | 2023.09.23 |
스키마 정의와 스키마 정의의 차이? (0) | 2023.09.23 |
nodejs에서 senecajs(micros 서비스 툴킷)를 사용하여 mariadb에 질문 배열을 삽입하는 방법? (0) | 2023.09.23 |
객체를 배열로 변환 (0) | 2023.09.23 |