[database] 모든 레코드를 반환하는 Elasticsearch 쿼리

Elasticsearch에 작은 데이터베이스가 있으며 테스트 목적으로 모든 레코드를 가져오고 싶습니다. 양식의 URL을 사용하려고합니다 …

http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}

누군가 당신이 이것을 달성하는 데 사용할 URL을 줄 수 있습니까?



답변

나는 lucene 구문이 지원된다고 생각합니다.

http://localhost:9200/foo/_search?pretty=true&q=*:*

크기는 기본적으로 10으로 설정되므로 &size=BIGNUMBER10 개 이상의 항목을 가져와야 할 수도 있습니다. (여기서 BIGNUMBER는 데이터 세트보다 큰 숫자라고 생각합니다)

그러나 elasticsearch 문서 스캔 검색 유형을 사용하여 큰 결과 세트를 제안 합니다.

EG :

curl -XGET 'localhost:9200/foo/_search?search_type=scan&scroll=10m&size=50' -d '
{
    "query" : {
        "match_all" : {}
    }
}'

위의 문서 링크에 따라 계속 요청하십시오.

편집 : scan2.1.0에서 더 이상 사용되지 않습니다.

scanscroll의해 정렬 된 일반 요청에 비해 어떠한 이점도 제공하지 않습니다 _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


답변

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_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가 상당히 느려집니다. 모든 문서를 가져 오는 데 사용하는 한 가지 방법은 스캔 및 스크롤 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또한 별 명당 요소의 크기 및 수와 같이 모든 별명에 대한 통계를 가져 오는 데 사용 하면 매우 유용하고 유용한 정보를 제공합니다.