Elasticsearch查询返回所有记录

问题描述:

我在Elasticsearch中有一个小型数据库,并且为了测试目的想要将所有记录都拉回来。我试图使用的形式的URL ...Elasticsearch查询返回所有记录

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

有人可以给我的URL你会用来完成这个,请?

我认为Lucene的语法支撑:

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

大小默认为10,所以您可能还需要&size=BIGNUMBER获得10余项。 (其中BIGNUMBER等于你认为比你的数据集大的数字)

但是,elasticsearch文档suggests对于大型结果集,使用扫描搜索类型。

EG:

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

,然后继续要求按照上面的文档链接提示。

编辑:scan在2.1.0中不推荐使用。

scan与按照_doc排序的常规scroll请求相比不提供任何优惠。 link to elastic docs(由@克里斯托夫 - 鲁西看准)

+4

感谢。这是最后我想出了,返回我现在需要的... http:// localhost:9200/foo/_search?size = 50&pretty = true&q = *:* – 2012-01-12 09:41:09

+1

添加到@ Steve的答案,你可以找到一个elasticsearch在此链接中可以理解的参数列表http://www.elasticsearch.org/guide/reference/api/search/uri-request/ – 2013-07-31 08:36:51

+0

是否有可能使用match_all查询以外的查询运行扫描搜索? – Churro 2013-09-10 20:30:23

查询下面将返回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的数值结果

curl -XGET 'localhost:9200/_search' -d ' 

搜索中的所有指标各类

curl -XGET 'localhost:9200/foo/_search' -d ' 

搜寻所有类型的富指数

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 ' 

搜索类型的用户,并在所有指数鸣叫

+8

默认情况下,ES将返回10个结果,除非基本查询中包含大小参数。 – lfender6445 2014-04-07 03:11:39

+0

以前的回答是三岁。将其更新为当前版本。 – vjpan8564 2015-07-11 18:19:59

http://127.0.0.1:9200/foo/_search/?size=1000&pretty=1 
           ^

注意大小参数,增加从默认显示的点击( 10)到每个碎片1000。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-from-size.html

+1

虽然有一点需要记住(来自Elasticsearch文档):请注意,从+大小不能超过index.max_result_window索引设置,默认值为10,000。 – user3078523 2018-02-14 11:47:32

使用server:9200/_stats也让你所有的别名统计..喜欢的大小和每别名元素的数量,这是非常有用的,并提供有用的信息

+2

但是,从我记得,ES只允许每个请求获得16000个数据。所以如果数据超过16000,这个解决方案是不够的。 – 2016-04-23 22:48:23

elasticsearch(ES)同时支持GET或从ES集群索引获取数据的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将获得显着较慢,如果你只是添加一个大号作为大小,一种方法来使用获取所有文件正在使用扫描和滚动ID。

所以,你的电话是:

GET /foo/_search?search_type=scan&scroll=1m 
{ 
    "query": { "match_all": {}}, 
    "size": 1000 
} 

这将返回一个_scroll_id,你现在可以用它来得到第一批文件。

https://www.elastic.co/guide/en/elasticsearch/guide/current/scan-scroll.html

简单!您可以使用sizefrom参数!

http://localhost:9200/[your index name]/_search?size=1000&from=0 

然后您逐渐更改from,直到您获取所有数据。

+1

如果数据中包含很多文档,请不要使用此方法...每次进入“下一页”弹性将变得越来越慢!使用SearchAfter代替 – Joshlo 2017-07-20 13:25:57

他们中的一些人给出了使用扫描和滚动的正确答案,显然,我无法得到一个可以神奇地工作的完整答案。当有人想要拉记录时,必须按照curl命令运行。

curl -XGET 'http://ip1:9200/myindex/_search?scroll=1m' -d ' 
{ 
    "query": { 
      "match_all" : {} 
    } 
} 
' 

但是我们没有在这里完成。上述curl命令的输出会是这样的

{"_scroll_id":"c2Nhbjs1OzUyNjE6NU4tU3BrWi1UWkNIWVNBZW43bXV3Zzs1Mzc3OkhUQ0g3VGllU2FhemJVNlM5d2t0alE7NTI2Mjo1Ti1TcGtaLVRaQ0hZU0FlbjdtdXdnOzUzNzg6SFRDSDdUaWVTYWF6YlU2Uzl3a3RqUTs1MjYzOjVOLVNwa1otVFpDSFlTQWVuN211d2c7MTt0b3RhbF9oaXRzOjIyNjAxMzU3Ow==","took":109,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":22601357,"max_score":0.0,"hits":[]}} 

其重要的是拥有_scroll_id方便,因为第二天你SHD运行以下命令

curl -XGET 'localhost:9200/_search/scroll' -d' 
    { 
     "scroll" : "1m", 
     "scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1" 
    } 
    ' 

不过,我不认为它容易手动运行。你最好的选择是编写一个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来提取数据。

这是最好的解决方案,我发现使用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

的最佳方式来调整大小使用size = numbe [R在URL

Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty" 

注面前:最大值可以在这个尺寸可以定义为10000一万以上的任何值,预计您使用滚动功能这将最大限度地减少影响到性能的任何机会。

+0

由于哪个版本的最大尺寸发生了? – WoodyDRN 2017-02-04 01:10:51

您可以使用尺寸= 0这将返回所有的文件 例如

curl -XGET 'localhost:9200/index/type/_search' -d ' 
{ 
    size:0, 
    "query" : { 
    "match_all" : {} 
    } 
}' 
+1

这将返回一个累积的信息,但不是点击自己 – user732456 2017-03-30 13:17:18

+0

对不起,我必须downvote误导 – 2017-07-13 06:40:21

http://localhost:9200/foo/_search/大小 = 1000 &漂亮= 1

你需要指定大小的查询参数的默认值是10

+1

它的工作谢谢 – 2017-06-06 15:00:52

+0

欢迎您@ hamzeh.hanandeh .....很高兴这有助于别人 – 2017-06-06 16:20:04

您可以使用_count API来获取价值,为size参数:

http://localhost:9200/foo/_count?q=<your query> 

返回{count:X, ...}。提取值 'X',然后执行实际查询:

http://localhost:9200/foo/_search?q=<your query>&size=X 

大小 PARAM增加从默认显示的点击数(10)500

http://localhost:9200/[indexName]/_search?pretty=true&size=500&q=*:*

更改步逐步获取所有数据。

http://localhost:9200/[indexName]/_search?size=500&from=0

要从你可以做所有的索引返回所有记录:

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, 
     ...